UITableView 선택을 비활성화하려면 어떻게해야합니까?


1192

에서 행을 누르면 UITableView행이 강조 표시되고 선택됩니다. 이것을 비활성화하여 행을 두드리면 아무것도 할 수 없습니까?


17
원래 질문의 제목이 잘못되었습니다. OP는 주로 disable selection을 원하고 물론 물론 highlighting비활성화됩니다. 많은 투표 응답 disable selection은 비활성화 방법을 설명 하고 비활성화하지 않습니다 highlighting. 강조 표시 만 비활성화 cell.selectionStyle = .None하거나 다음으로 이동storyboard / cell / Selection = None
Andrej

제목이나 게시물을 업데이트하십시오. 혼란 스러워요. 그리고이 질문에 기초하여, 제공된 답변이 무엇을 의미하는지 전혀 알지 못합니다.
Daniel Springer

답변:


603

나를 위해 다음이 잘 작동했습니다.

tableView.allowsSelection = false

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

(셀에서, UIButton또는 다른 컨트롤이있는 경우 물론 해당 컨트롤은 계속 작동합니다. 테이블 셀에 대해 발생하는 모든 컨트롤은 UITableView의 "행 선택"기능과 전혀 관련이 없습니다. 사용하여 didSelectRowAt#.)

주의해야 할 또 다른 사항은 다음과 같습니다 UITableView. 편집 모드에 있을 때는 작동하지 않습니다 . 편집 모드에서 셀 선택을 제한하려면 다음과 같은 코드를 사용하십시오.

tableView.allowsSelectionDuringEditing = false 

6
이것은 마침내 나를 위해 일했다. 나는 cell.selectionStyle = UITableViewCellSelectionStyleNone; 그러나 작동하지 않았습니다. 한 가지주의 할 점은 다음과 같아야합니다. tableView.allowsSelection = NO; 거짓이 아닙니다.
tony.tc.leung

6
나는 이것이 최선의 선택이라고 생각한다. 이 버튼으로 셀의 버튼이 활성화되어 있지만 텍스트는 활성화되어 있지 않습니다.
Fahim Parkar

513
이 답변은 어떻게 받아 들여지고이 많은 투표권이 있습니까? 질문에 전혀 답하지 않습니다! selectionStyle셀 의 속성을 cell.selectionStyle = UITableViewCellSelectionStyle.NoneSwift 또는 cell.selectionStyle = UITableViewCellSelectionStyleNoneObjective-C에서 설정해야합니다 .
nodebase

5
이것은 스위프트 2에서 나를 위해 작동합니다.tableView.allowSelection = false
Khanad

15
원하는 것에 따라 몇 가지 방법이 있습니다. 선택 스타일과 선택이 모두 작동하지 않거나 둘 다 실패 할 수 있습니다. 다음은 예입니다. 셀을 선택하고을 tableViewDidSelectRowAtIndexPath호출하려면 cell.selectionStyle = .None원하는 것이 좋습니다. 해당 델리게이트 함수를 호출하거나 원하지 않는 경우 (즉, tableViewCell에 텍스트 필드가 있음) 설정 tableView.allowsSelection = false은 괜찮습니다.
Made2k

1963

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

목표 -C :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

또는

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

스위프트 2 :

cell.selectionStyle = UITableViewCellSelectionStyle.None

스위프트 3과 4.x :

cell.selectionStyle = .none

또한 -tableView:didSelectRowAtIndexPath:테이블 뷰 대리자에서 구현하지 않거나 구현하지 않을 경우 조치를 취하지 않을 셀을 명시 적으로 제외해야합니다.

여기여기에 더 많은 정보


122
@Tony 셀 안에 UITextField가 있으면 좋지 않습니다.
Aniruddh Joshi

73
@TonyMillion 또한 스 와이프하여 삭제와 같은 내장 편집 컨트롤을 사용하려는 경우 나쁜 생각입니다. userInteractionEnabled를 NO로 설정하면 삭제 버튼이 사용자 터치 이벤트에 응답하지 않습니다.
Carlos P

47
이 스레드에 늦었지만 userInteraction 대신 cell.allowsSelection을 사용하십시오. 셀의 상호 작용 방법은 중지하지만 일반적인 UIView 응답자 항목은 차단하지 않습니다.
Chris C

4
cell.userInteractionEnable = No를 설정하면 didSelectRowAtIndexPath 트리거가 중지되지 않습니다.
user4951

25
나는 대답을 투표 할 것이지만 분명하게 말하면 OP는 "강조 표시"를 비활성화하고 전체 셀 상호 작용을 비활성화하지 말라고 요청했기 때문에이 모든 의견은 주제가 아닙니다.
Frederic Yesid Peña Sánchez

353

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



따라서 원하는 논리 및 / 또는 결과에 따라 실제로 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을 대화식으로 허용합니다 .


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

[cell setUserInteractionEnabled:NO];



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

[tableView setUserInteractionEnabled:NO];



셀을 강조 표시할지 여부를 즉시 결정하려면 ( 이 답변 에 따라 선택 포함됨) 다음 UITableViewDelegate프로토콜 방법을 구현할 수 있습니다 .

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

3
펜촉에서 셀 디자인을로드하는 경우 확인란 (IB)은 # 3 (및 # 4 테이블)에서 제대로 작동합니다. # 4 대 # 2의 경우 셀 내부의 컨트롤이 대화 형인지의 차이가 있습니까?
lilbyrdie 2016 년

4
예. 선택을 비활성화하고 UIButtons 등이 사용자 상호 작용을 계속 지원하도록하려면 # 2를 사용하십시오. 완전히 읽기 전용 인 셀을 원하면 # 4를 사용하십시오. 물론 비 대화식 셀에 UIView 또는 UILabels 이외의 다른 기능이 필요한 이유는 무엇입니까? 다른 누군가가 발생하는 동안 누군가가 모든 상호 작용을 비활성화하고 싶을 수도 있습니다.
mbm29414

8
# 4는 끔찍한 아이디어입니다. 이렇게하면 테이블보기에서도 스크롤이 비활성화됩니다
simon

4
@simon 사실, 그것은 끔찍한 생각이 아닙니다. 상황에 따라 좋은 옵션 일 수도 있고 아닐 수도있는 옵션입니다. 또한 # 4는 USER 스크롤을 비활성화합니다. 필요한 경우 여전히 직접 구현할 수 있습니다. # 4가 유용하지 않다는 데 동의하지만 끔찍한 아이디어는 아닙니다.
mbm29414

3
완성도를 위해 당신은 소리 아웃에 대한 추가 기쁘게 할 수 tableView:shouldHighlightRowAtIndexPath:있다 일반적으로 (항상) 내 선호 된 접근을.
Benjohn

82

내가 구현 한 경험을 바탕으로 정답이라고 생각하는 것을 요약하면 다음과 같습니다.

일부 셀에 대해서만 선택을 사용하지 않으려면 다음을 사용하십시오.

cell.userInteractionEnabled = NO;

선택을 방지 할뿐만 아니라 설정된 셀에 대해 tableView : didSelectRowAtIndexPath : 호출을 중지합니다. (이 답변에 대해 크레딧은 Tony Million에게갑니다. 감사합니다!)

셀에 클릭해야하는 버튼이 있으면 대신 다음을 수행해야합니다.

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

의 셀에 대한 클릭도 무시해야합니다 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath.

전체 테이블에 대해 선택을 비활성화하려면 다음을 사용하십시오.

tableView.allowsSelection = NO;

(Paulo De Barros에게 감사드립니다!)


셀에 버튼이 있다면 어떨까요?
Umair Afzal

56

아이폰 OS 6.0으로 UITableViewDelegate있다 tableView:shouldHighlightRowAtIndexPath:. (iOS 문서 에서 이에 대해 읽으십시오 .)

이 방법을 사용하면 셀의 선택 스타일을 변경하거나 셀의 이벤트 처리를 방해 userInteractionEnabled = NO하거나 여기에 문서화 된 다른 기술 을 사용하지 않고도 특정 행을 강조 표시 할 수없고 암시 적으로 선택할 수없는 것으로 표시 할 수 있습니다.


2
이 스레드를 우연히 발견 했으며이 전에 많은 다른 답변을보고 충격을 받았습니다. 이것은 의심의 여지없이 올바른 방법입니다.
beebcon

2
이것은 실제로 정확하고 고려해야 할 유일한 대답입니다. userInteraction에 대해 언급 한 내용이 완전히 잘못되었습니다.
mattyohe

50

당신은 선택하여 자체 빌더 인터페이스에서 행의 비활성화 선택도 할 수 NoSelection로부터 selection아래 그림과 같이 관리자 창에서 (jQuery과 속성의) 옵션

UITableView 인스펙터


2
최고의 솔루션 IMHO
Itai Spector

나는 종종이 솔루션을 사용합니다
Evsenev


36

당신에서 UITableViewCellXIB 의 특성 검사기 설정 값 SelectionNone.

여기에 이미지 설명을 입력하십시오


이것이 바로 내가 필요한 것입니다. 나는 여전히 didSelect ... 알림을 원했지만 선택 표시가 보이지 않았습니다. 감사!
Timothy Tripp

도움이되어 다행입니다. :)
Zaid Pathan

35

선택 만 플래시 상태로 유지하고 선택한 상태를 유지하지 않으려면

didSelectRowAtIndexPath

다음과 같은

[tableView deselectRowAtIndexPath:indexPath animated:YES];

선택한 상태가 깜박이고 되돌아갑니다.


3
이 방법을 사용하면 행이 즉시 강조 표시되고 0.5 초에 걸쳐 사라집니다. 이것이 Apple이 설정 메뉴의 스타일을 지정하는 방식이므로 나에게 잘 어울립니다.
VinceFior

34

누군가 Swift에 대한 답변이 필요한 경우 :

cell.selectionStyle = .None

1
이 cell.selectionStyle = UITableViewCellSelectionStyle.None을 사용할 수도 있습니다
아마도

29

이것이 내가 사용 cellForRowAtIndexPath하는 코드입니다. :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

28

로부터 UITableViewDelegate프로토콜 당신이 방법을 사용할 수 있습니다 willSelectRowAtIndexPath 그리고 return nil당신은 행을 선택하지 않을 경우.

같은 방법으로 willDeselectRowAtIndexPath메소드를 사용할 수 return nil있으며 행을 선택 취소하지 않으려는 경우.


5
나는이 방법이 마음에 들지 않을 때까지 강조 표시된 상태로 셀을 보여주기 때문에 마음에 들지 않습니다.
kbanman

2
그것이 바로 내가 좋아하는 이유입니다 :-)
Joris Weimar

24

1- 당신이해야 할 일은 다음 중 하나를 사용 하여UITableViewCell 인스턴스 에서 선택 스타일을 설정하는 것입니다.


목표 -C :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

또는

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


스위프트 2 :

cell.selectionStyle = UITableViewCellSelectionStyle.None


스위프트 3 :

cell.selectionStyle = .none


2-구현하지 마십시오- tableView:didSelectRowAtIndexPath:테이블보기에서 구현하지 않으면 delegate조치를 취하지 않을 셀을 명시 적으로 제외하십시오.

3-또한 스토리 보드에서 할 수도 있습니다. 테이블 뷰 셀을 클릭하고 테이블 뷰 셀 아래의 속성 관리자에서 선택 옆의 드롭 다운을 없음으로 변경하십시오.


4-(iOS) Xcode 9, Swift 4.0 에서 아래 코드를 사용하여 테이블 셀 강조 표시를 비활성화 할 수 있습니다

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
        cell.selectionStyle = .none
        return cell


}

20

목표 -C :

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

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

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
  3. 스 니펫 아래에서 셀의 모든 항목을 사용 중지합니다. 이에 상호 작용을 비활성화합니다 buttons, textfields:

    self.tableView.userInteractionEnabled = false;

빠른:

아래는 Swift위의 Objective-C솔루션 과 동일 합니다.

  1. 첫 번째 솔루션 교체

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

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

    self.tableView.userInteractionEnabled = false

19

다음을 입력하십시오.

cell.selected = NO;

필요할 때 행을 선택 해제합니다.

스위프트 3에서 ...

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

14

나는 재산 UITableViewCell의 사용을 금지 하는 통제력을 가지고 상당히 풍부하게 싸우고 userInteractionEnabled있습니다. 설정에 대한 3 셀 정적 테이블, 날짜가있는 2, 켜기 / 끄기 스위치가있는 1이 있습니다. Storyboard / IB에서 게임을 한 후에 하단을 선택할 수 없게 만들었지 만 탭하면 맨 위 행 중 하나에서 선택이 사라집니다. 내 설정 UITableView의 WIP 이미지는 다음과 같습니다.

설정 UITableView

세 번째 행을 탭해도 아무 일도 일어나지 않으면 선택은 두 번째 행에 유지됩니다. 이 기능은 사실상 Apple의 캘린더 앱의 이벤트 추가 시간 선택 화면의 사본입니다.

코드는 놀랍게도 호환 가능합니다. IOS2 = / :

- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 2) {
        return nil;
    }
    return indexPath;
}

이것은 선택 스타일을 없음으로 설정하는 것과 함께 작동하므로 터치 다운 이벤트에서 셀이 깜박이지 않습니다.


11

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

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

그러나 우리는이있을 때 사용자 정의 셀 XIB 선 위 주고 경고를 위한 그 시간에

주문 세포 xib

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


11

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

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

cell.selectionStyle = UITableViewCellSelectionStyle.None

고맙습니다. 셀에 이미지가 있고 그 위에 레이블이 있습니다. 레이블 배경을 설정했지만 배경을 클릭 할 때마다 사라질 때마다 해결되었습니다.
Darko

10

이 시도

cell.selectionStyle = UITableViewCellSelectionStyleNone;

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

interfacebuilder를 사용하여 선택 스타일을 설정할 수도 있습니다.



7

이것은 선택하는 동안 행에 강조 표시가 나타나지 않도록하는 가장 쉽고 쉬운 솔루션이지만

cell.selectionStyle = UITableViewCellSelectionStyleNone;

또한 행이 선택되었다는 것을 간단히 보여주고 끄는 것이 유용한 경우가 종종 있습니다. 그러면 사용자에게 선택하려는 내용을 확인하는 알림이 표시됩니다.

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


6

UItableviewcell 강조 표시를 비활성화하려면

cell.selectionStyle = UITableViewCellSelectionStyleNone;

그리고 사용자가 셀과 상호 작용할 수 없어야합니다.

cell.userInteractionEnabled = NO;

6

또한 사용하고 UITableViewCellSelectionStyleNone싶지 않거나 사용할 수없는 경우 와 같은 효과를 얻기 위해 배경색을 Clear로 설정할 수도 있습니다 UITableViewCellSelectionStyleNone.

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

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

셀에 추가 색상보기를 추가 할 때 성능 이 저하 될 수 있습니다 .


6

당신이 사용할 수있는 :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

UITableView의 인덱스 경로 메소드에서 행의 셀에.

또한 당신은 사용할 수 있습니다 :

[tableView deselectRowAtIndexPath:indexPath animated:NO];

tableview didselectrowatindexpath 방법에서.


그것은 지금 cell.selectionStyle = UITableViewCellSelectionStyle.none스위프트 3에 있습니다.
Dan

5

이것을 사용할 수 있습니다

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5

당신이 사용할 수있는 ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


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

행복한 코딩!


5

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.