ios - uitableviewcell - 어떻게 UITableView 선택을 해제 할 수 있습니까?




xcode uitableview selection (20)

UITableView 에서 행을 탭하면 해당 행이 강조 표시되고 선택됩니다. 이 기능을 비활성화하여 행이 아무 것도하지 않도록 할 수 있습니까?


목표 -C :

  1. 스 니펫 아래에서 강조 표시를 비활성화하지만 didSelectRowAtIndexPath 대한 호출도 비활성화합니다. 따라서 didSelectRowAtIndexPath 를 구현하지 않으면 아래의 메소드를 사용하십시오. 테이블을 만들 때 추가해야합니다. 이것은 버튼과 UITextField 셀에서 작동합니다.

    self.tableView.allowsSelection = NO;
    
  2. 아래 스 니펫은 강조 표시를 비활성화하고 didSelectRowAtIndexPath 대한 호출을 비활성화하지 않습니다. cellForRowAtIndexPath 에서 셀의 선택 스타일을 없음으로 설정합니다.

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
  3. 스 니펫 아래에서 셀의 모든 것을 비활성화하십시오. buttons , textfields 의 상호 작용이 비활성화됩니다.

    self.tableView.userInteractionEnabled = false;
    

빠른:

아래는 Objective-C 솔루션의 Swift 해당합니다.

  1. 첫 번째 솔루션 교체

    self.tableView.allowsSelection = false
    
  2. 두 번째 솔루션 교체

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
    
  3. 세 번째 솔루션 교체

    self.tableView.userInteractionEnabled = false
    

UITableViewCell의 selectionStyle 속성을 사용할 수 있습니다.

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

또는

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

또한 위임자를 구현하지 마십시오.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }

Xib / Storyboard 파일을 만든 경우 unchecking 을 사용하여 tableview의 setUserInteractionEnabled 속성을 No 로 변경할 수 있습니다. 이렇게하면 테이블 뷰가 읽기 전용이됩니다.


iOS 6.0부터 UITableViewDelegatetableView:shouldHighlightRowAtIndexPath: 있습니다. (iOS Documentation 에서 자세히 읽어보십시오.)

이 메소드를 사용하면 셀의 선택 스타일을 변경하거나, userInteractionEnabled = NO 사용하여 셀의 이벤트 처리를 userInteractionEnabled = NO 하거나, 여기에 설명 된 다른 기술없이 특정 행을 중요하지 않은 (암시 적으로 선택 취소 할 수없는) 행으로 표시 할 수 있습니다.


나는 나를 위해 일하는 이것을 사용하고 있습니다.

cell?.selectionStyle = UITableViewCellSelectionStyle.None

나에게 다음은 잘 작동했다.

tableView.allowsSelection = NO;

이것은 didSelectRowAt# 단순히 작동하지 않는다는 것을 의미합니다. 말하자면, 테이블의 행을 만지는 것은 절대적으로 아무것도하지 않을 것입니다. (따라서 분명히 선택된 애니메이션이 존재하지 않을 것입니다.)

(셀에 UIButton 또는 다른 컨트롤이있는 경우 해당 컨트롤이 여전히 작동한다는 점에 유의하십시오. 테이블 셀에서 발생하는 모든 컨트롤은 UITableView의 "행 선택"기능과 완전히 관련이 없습니다 " didSelectRowAt# .)


다음 중 하나를 사용하여 UITableViewCell 인스턴스에서 선택 스타일을 설정하기 UITableViewCell 됩니다.

목표 -C :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

또는

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

스위프트 2 :

cell.selectionStyle = UITableViewCellSelectionStyle.None

스위프트 3 및 4.x :

cell.selectionStyle = .none

또한 테이블보기 대리자에 -tableView:didSelectRowAtIndexPath: 를 구현하지 않았는지 확인하십시오. 그렇지 않으면 명시 적으로 작업을 수행하지 않으려는 셀을 명시 적으로 제외하십시오.

여기here 대한 자세한 정보


선택하는 동안 행에 강조 표시가 나타나지 않도록하는 가장 쉽고 편리한 방법이지만

cell.selectionStyle = UITableViewCellSelectionStyleNone;

또한 행이 선택되었다는 것을 간략히 보여주고 그 행을 끄는 것이 때때로 유용하다고 제안하고 싶습니다. 이렇게하면 사용자가 무엇을 선택하려고했는지 확인하는 메시지가 나타납니다.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}

선택한 상태로 유지되지 않고 선택 만 깜박이기를 원할 경우 전화를 걸 수 있습니다.

didSelectRowAtIndexPath

다음과 같은

[tableView deselectRowAtIndexPath:indexPath animated:YES];

그래서 그것은 선택된 상태를 플래싱하고 복귀 할 것입니다.


스토리 보드에서도 할 수 있습니다. 테이블 뷰 셀을 클릭하고 표 속성보기 아래의 속성 관리자에서 선택 항목 옆의 드롭 다운을 없음으로 변경합니다.


신속한 선택 취소

cell.selectionStyle = .None

요약하면 다음과 같은 구현 경험을 바탕으로 정답입니다.

셀 중 일부만 선택을 해제하려면 다음을 사용하십시오.

cell.userInteractionEnabled = NO;

선택을 방지 할뿐만 아니라 tableView : didSelectRowAtIndexPath : 설정 한 셀을 호출합니다. (신용은이 대답을 위해 Tony Million에게갑니다, 감사합니다!)

셀에 클릭해야하는 버튼이있는 경우 대신 다음 작업을 수행해야합니다.

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 에서 셀의 모든 클릭을 무시해야합니다.

전체 테이블에 대한 선택을 해제하려면 다음을 사용하십시오.

tableView.allowsSelection = NO;

(Paulo De Barros에게 감사, 감사합니다!)


우리는 다음과 같은 코드를 작성할 수있다.

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

하지만 위의 사용자 정의 셀 xib 가있을 때 그 시간에 경고 를줍니다.

사용자 지정 셀 xib

인터페이스 빌더에서 선택 스타일 없음설정 해야합니다.


이 코드를 cellForRowAtIndexPath에 넣으면됩니다.

셀의 선택 속성을 비활성화하려면 : (셀을 두드리는 동안).

cell.selectionStyle = UITableViewCellSelectionStyle.None

이것을 사용할 수 있습니다.

cell.selectionStyle = UITableViewCellSelectionStyleNone;

입력 해보십시오 :

cell.selected = NO;

필요한 경우 행의 선택을 취소합니다.

Swift3에서 ...

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let r = indexPath.row
    print("clicked .. \(r)")
    tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}

최근에이 게시물을 읽었으며 도움이 되었기 때문에 모든 답변을 통합하는 또 다른 답변을 게시하고 싶습니다 (후손을 위해).


따라서 원하는 논리 및 / 또는 결과에 따라 실제로 5 가지 답변이 있습니다.

1. 셀의 다른 상호 작용을 변경하지 않고 파란색 강조 표시를 비활성화하려면 :

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

UITableViewCell에 호스팅 된 UIButton 또는 일부 다른 컨트롤이있을 때이 컨트롤을 사용하고 사용자가 컨트롤과 상호 작용할 수 있지만 셀 자체는 사용할 수 없도록하려고합니다.

참고 : 위에서 언급 한 Tony Million이 tableView:didSelectRowAtIndexPath: 방지하지는 않습니다. 간단한 "if"문으로이 문제를 해결하고, 가장 자주 섹션을 테스트하고 특정 섹션에 대한 작업을 피합니다.

내가 이런 식으로 셀을 두드리는 지 테스트하려고 생각한 또 다른 방법은 다음과 같습니다.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // A case was selected, so push into the CaseDetailViewController
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.selectionStyle != UITableViewCellSelectionStyleNone) {
        // Handle tap code here
    }
}



2. 전체 테이블에 대해 이렇게하려면 테이블의 각 셀에 위의 솔루션을 적용 할 수 있지만 이렇게 할 수도 있습니다.

[tableView setAllowsSelection:NO];

내 테스트에서이 여전히 UITableViewCell 내부 컨트롤을 대화 형 수 있습니다.


3. 셀을 "읽기 전용"으로 만들려면 다음과 같이하면됩니다.

[cell setUserInteractionEnabled:NO];



4. 전체 테이블을 "읽기 전용"으로 만들기

[tableView setUserInteractionEnabled:NO];



5. 셀을 강조 표시할지 여부를 결정하려면 ( 이 답변 에 따라 암시 적으로 선택 항목 이 포함됨) 다음 UITableViewDelegate 프로토콜 메소드를 구현할 수 있습니다.

- (BOOL)tableView:(UITableView *)tableView 
   shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath

UITableViewCellSelectionStyleNone 사용하거나 사용하지 않으려는 경우에 대비하여 배경색을 Clear로 설정하여 UITableViewCellSelectionStyleNone 동일한 효과를 얻을 수도 있습니다.

다음과 같은 코드를 사용합니다.

UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];

이로 인해 셀에 색이 추가 된보기가 추가되어 성능이 저하 될 수 있습니다 .


UITableViewDelegate 프로토콜에서 행을 선택하지 않으려면 willSelectRowAtIndexPath 메소드를 사용하고 return nil 할 수 있습니다.

같은 방법으로 willDeselectRowAtIndexPath 메서드를 사용하고 행을 선택 해제하지 않으려면 return nil 할 수 있습니다.


신속한 맞춤형 셀 솔루션 :

import Foundation

class CustomTableViewCell: UITableViewCell
{
  required init(coder aDecoder: NSCoder)
  {
    fatalError("init(coder:) has not been implemented")
  }

  override init(style: UITableViewCellStyle, reuseIdentifier: String?)
  {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    self.selectionStyle = UITableViewCellSelectionStyle.None
  } 
}

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

해피 코딩 !!!







cocoa-touch