UITableView 일부 셀을 "선택할 수 없음"으로 설정


109

UITableView의 셀 속성을 선택 불가능으로 설정하려면 어떻게해야합니까? 사용자가 셀을 탭할 때 파란색 선택 상자를보고 싶지 않습니다.


4
방법은 아이폰 OS 6으로이 작업을 수행하기 위해 더 큰입니다 : 최근 Google 직원 참고 tableView:shouldHighlightRowAtIndexPath:아래 Ayush에 의해 지적
jemmons

답변:


151

표 셀의 selectionStyle속성을로 설정합니다 UITableViewCellSelectionStyleNone. 이렇게하면 강조 표시되지 않으며에서 해당 속성을 확인할 수도 있습니다 tableView:didSelectRowAtIndexPath:.


3
Kendall이 옳습니다. didSelectRowAtIndexPath가 처음에 호출되지 않도록 Sebastian Celis의 답변을 따르십시오. 그러나 강조 표시를 방지하려면 selectionStyle도 설정해야합니다.
Daniel Dickison

예, Sebastian Celis의 대답이 정답이라고 생각합니다. Daniel
LolaRun

1
있는 UITableViewCell을 선택하고 아래 검사기가 찾을 수있는 속성 수있는 정적 TableViews를 사용하여 스토리 보드 팬 선택 필드와로 설정 없음
마누엘 BM을

197

행 선택을 방지하려면

완전히의 선택을 방지하기 위해 UITableViewCell, 당신은이 UITableViewDelegate구현 tableView:willSelectRowAtIndexPath:. 해당 방법 nil에서 행을 선택하지 않으려면 반환 할 수 있습니다 .

- (NSIndexPath *)tableView:(UITableView *)tv willSelectRowAtIndexPath:(NSIndexPath *)path
{
    // Determine if row is selectable based on the NSIndexPath.

    if (rowIsSelectable) {
        return path;
    }
    return nil;
}

이렇게하면 행이 선택되거나 tableView:didSelectRowAtIndexPath:호출되지 않습니다. 그러나 이것이 행이 강조 표시되는 것을 방지 하지는 않습니다 .

행 강조 표시를 방지하려면

터치시 행이 시각적으로 강조 표시되지 않도록하려면 셀이 selectionStyle로 설정되어 있는지 확인 UITableViewCellSelectionStyleNone하거나 다음과 같이 UITableViewDelegate구현할 수 있습니다 tableView:shouldHighlightRowAtIndexPath:.

- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Determine if row is selectable based on the NSIndexPath.

    return rowIsSelectable;
}

1
감사! 정확히 내가 필요한 것.
Buchannon 2011-06-13

10
이것은 제 생각에 받아 들여진 대답이어야합니다. 실제로 마스킹하는 대신 문제를 수정합니다.
Tovi7

4
tableView : willSelectRowAtIndexPath :는 셀을 강조 표시 한 후 호출되어 깜박임을 생성합니다. Apple의 설명에서 : 이 메서드는 사용자가 행을 터치 한 다음 손가락을 뗄 때까지 호출되지 않습니다. 행은 터치 다운시 강조 표시되지만 그때까지는 선택되지 않습니다.
Daniel

5
@simpleBob에 동의합니다. 이 솔루션을 사용하려면 선택 불가능한 행에서 cell.selectionStyle을 UITableViewCellSelectionStyleNone으로 설정해야합니다. 그렇지 않으면 촌스러워 보입니다.
Kyle Clegg 2013 년

그렇다면 가장 좋은 대답은 여전히 ​​받아 들여지는 대답입니다. 어쨌든 항상 호출 didSelectRowAtIndexPath되기 때문에 아무것도하지 않도록 선택할 수 있습니다 willSelectRowAtIndexPath.
마태 복음 Quiros

16

이것을 사용하십시오 :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5
선택 색상이 표시되는 것을 중지 할 뿐이며 didSelectRowAtIndexPath여전히 호출됩니다.
zekel 2010

이것은 또한이 질문에 대한 Daniel Dickison의 대답과 똑같습니다.

스위프트 2.2 UPDATE - cell.selectionStyle = UITableViewCellSelectionStyle.None
uplearnedu.com

11

iOS 6 이상 전용.

tableView:shouldHighlightRowAtIndexPath:대리자 에서 메서드 를 구현할 수 있습니다 . 자세한 내용은 http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html


3
훨씬 더 많은 찬성표가 있어야합니다. 이것은 정답입니다. 셀이 선택된 것을 볼 수 없도록 선택 스타일을 변경하고, 셀을 탭할 수 없도록 사용자 상호 작용을 비활성화하거나 선택시 셀을 선택 취소하는 것은 해킹입니다.
Stuart Campbell

9

이 문제도 이미 언급 한 모든 것을 시도했습니다. 표 셀을 선택할 때 "파란색 깜박임"을 없앤 마지막 트릭은 다음 줄을 추가하는 것입니다.

self.myTableView.allowsSelection = NO;

이 한 줄인지 모든 것이 합쳐 졌는지 확실하지 않지만 총체적인 결과로 더 이상 파란색 선택이나 파란색 깜박임이 표시되지 않습니다. 행복!


1
이것의 문제는 테이블 뷰의 모든 셀을 선택할 수 없도록 만든다는 것입니다. 일부 셀은 선택 가능하고 다른 셀은 선택 불가능하게하려면이 작업을 수행하지 않습니다. Sebastian의 접근 방식이 저에게 효과적이었습니다.
Terry

True, allowSelection = NO는 모든 셀에 대한 선택을 비활성화합니다.
JOM 2010-06-29

1
이 속성에 대한 인터페이스 빌더에 동등한 속성이 있습니까?
chrish

8

세트 cell.userInteractionEnabled = NO;


잠깐, 그렇게하세요. 일종의. 'FALSE'를 소문자로 만들고 그 미친 세미콜론을 잃습니다. 그것은 당신을 위해 그것을 신속하게 할 것입니다. 'FALSE'는 악하고 잘못되었고 이제 'NO'는 악하고 잘못되었습니다. '거짓'이 악하고 잘못된 다음 주까지 그렇게하세요.
HalR


3

Apple은 didSelectRowAtIndexPath에서 가장 먼저해야 할 일은 행을 선택 취소하는 것이라고 말합니다.

[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];

그런 다음 AccessoryType을 확인 표시로 변경하거나 없음 등으로 변경할 수 있습니다. 따라서 didSelectRowAtIndexPath를 입력 할 때 행을 선택 취소 할 수 있으며 선택되지 않은 경우 해당 행을 확인하지 마십시오.

테이블보기 프로그래밍 가이드


1
이 경우 사용자가 셀을 터치하면 잠시 동안 강조 표시되었다가 강조 표시되지 않습니다.하지만 제가 이해했듯이 강조 표시에서 완전히 중지하는 것이 중요합니다.
Kuba Suder

3

또 다른 방법은에 몇 가지 범주 메서드를 추가하는 것 UITableViewCell입니다. 나는 내 테이블을 만드는 방식 때문에 Sebastians (또한 좋은) 대답보다 이것을 좋아합니다. 다른 사람에게 도움이 될 것이라고 생각했습니다.

- (void)setSelectable:(BOOL)enabled {
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
    [self setUserInteractionEnabled:enabled];
}

- (BOOL)isSelectable {
    BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
                     [self isUserInteractionEnabled];
    return ! disabled;
}

3

Swift 4 :
UITableViewDelegate를 사용하여 선택 및 강조 표시를 방지 할 수 있습니다. shouldHighlightRowAt

이 답변은 사용자 지정 셀이 CustomTableViewCell로
생성되고 해당 사용자 지정 셀 내부에 isSelectable 이라는 부울을 생성했다고 가정합니다 .

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
    if cell.isSelectable == false {
        return false
    } else {
        return true
    }
}

이것은 Sebastian Celis의 objc 답변의 Swift 버전입니다.


1

당신은 인터페이스 빌더에서 셀을 설계 한 경우 '의 체크 박스를 제거하여이 작업을 수행 할 수 있습니다 사용 가능 사용자 상호 작용 에 대한'를 tableViewCell.


0

선택 항목이 파란색으로 표시되지 않도록하는 또 다른 간단한 방법이 있습니다.

파란색으로 표시하지 않을 셀을 선택하십시오.

그런 다음 속성 관리자 (측면의 속성보기에서 눈금자 아이콘 옆에있는 방패 아이콘)를 선택합니다.

그런 다음 'Selection'필드를 'Blue'에서 'None'으로 변경합니다.

아마도 이것은 여전히 ​​선택 중이며 원하는 것이 UI 효과를 피하는 것이라면 선택된 것으로 나타나지 않을 것입니다.


0

tableView : didSelectRowAtIndexPath : 대신 tableView : willDisplayCell : forRowAtIndexPath :를 사용하여 셀을 처음 터치 할 때 나타나는 플래시를 제거합니다.

- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

0

특정 행을 선택 해제하려면 두 가지 UITableView 대리자 메서드를 변경해야합니다.

아래 방법에서

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

셀 할당 후 아래 코드를 작성하십시오.

if(indexPath.row == someCellNumber) cell.selectionStyle =UITableViewCellSelectionStyleNone;

위의 코드는 어떻게 든 사용자가 선택하려고 할 때 셀을 강조 표시하지 않습니다.

아래이 대리자 메서드에서

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if(indexPath.row == someCellNumber) return;

    //for other cells write the code below...
}

쓰지 않으면 if(indexPath.row == someCellNumber) return;행이 계속 선택되고 앱이 충돌 할 가능성이 있습니다.



0

스위프트 5

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