-didSelectRowAtIndexPath : 호출되지 않음


295

탭보기 안에 테이블보기가있는 iOS 앱을 작성 중입니다. 내 UITableViewController에서는 구현 -tableView:didSelectRowAtIndexPath:했지만 런타임에 행을 선택할 때 메서드가 호출되지 않습니다. 테이블 뷰가 채워져 있으므로 컨트롤러의 다른 tableView 메서드가 호출되고 있음을 알고 있습니다.

누구든지 내가 그렇게하기 위해 내가 망쳐 놓은 아이디어가 있습니까?


79
또한 당신은 선택을 흡수 jQuery과 상단에 gestureRecognizer이있을 수 있습니다 .. (가능성 중 하나)
M.Othman

테이블 뷰가 채워지면주의하십시오. 이는 데이터 소스가 올바르게 설정되었음을 의미합니다. 선택은 델리게이트 메소드의 일부입니다. 따라서 데이터 소스가 제대로 설정되었지만 위임자는 아닙니다!
토마스 Besnehard

1
안녕하세요 M.Othman, 귀하의 의견은 정확히 내 자신의 문제에 있습니다. gestureRecognizer가 '함께'작동하는 방법을 알고 UITableView있습니까?
yhl

15
탭한 채로 있으면 탭이 결국에 전화합니다 -didSelectRowAtIndexPath. 나는 테이블 뷰에 탭 제스처 인식기가 있고 터치를 받기 전에 제스처가 먼저 실패해야하기 때문에 모자를 알아 냈습니다. 이상하지만 테이블 선택 애니메이션은 제스처 인식기의 영향을받지 않습니다.
Hlung

6
나는 여기에 같은 문제가 있었고 UITableView 위에 gestureRecognizer를 가질 수 없다는 것을 배울 수있는 행운의 기회를 가졌습니다. 감사합니다 M. Othman!
vnchopra

답변:


97

클래스가 UITableViewDelegate해당 테이블 뷰에 적합 하지 않은 것 같지만 UITableViewController자동으로 설정해야합니다.

대의원을 다른 수업으로 재설정 할 수 있습니까?


7
컨트롤러가 UITableViewController 인 동안 UI Builder에서 일반 UIUIController 위젯을 사용했음을 발견했습니다. 작동하지 않습니다. UIViewController 위젯을 삭제하고 대신 UITableViewController를 삭제하면 모든 것이 작동했습니다.
매트 Pfefferle

1
모두를위한 또 다른 경계 사례-코드로 델리게이트를 연결하고 스토리 보드를 통해 델리게이트를 이전에 연결 한 것을 잊었습니다.
Oliver Dungey

1
"다른 수업에 대리인을 재설정하는 방법"을 보여줄 수 있습니까? 나는 같은 문제가 있고 그것을 해결할 수 없습니다
Alfro

1
myTableViewController.tableView.delegate = xxx
헌터

534

누군가 내가했던 것처럼 멍청한 실수를 한 경우를 대비하여 :

예상 한 방법의 분석법 이름 didSelect이 실수로 didDeselect어떤 방식 으로 획득 될 수 있는지 확인하십시오 . 내가 알아내는 데 약 2 시간이 걸렸습니다 ...


47
여기에서도 같은 문제입니다. XCode가 선택 전에 선택 취소를 자동 완성하기 때문입니다.
user1021430 2016 년

마찬가지로, allowSelection = false를 설정했는데 선택 강조 표시를 제거하고 셀을 누르지 못하게합니다!
djinne95

503

이 문제로 이어질 수있는 또 다른 것은 선택 유형이 아닙니다.

UITableView 선택 종류

해야 Single Selection정상적인 선택을 위해,해야 하지No Selection.

프로그래밍 방식으로이 작업을 수행하려면 다음을 수행하십시오.

tableView.allowsSelection = YES

4
항상 편집 모드에있는 장면이 있고 "편집 중 선택하지 않음"에서 기본값을 변경하는 것을 잊어 버리기 때문에 계속해서 실행됩니다.
대칭

3
viewControlller의 -viewDidLoad 메소드에이 행을 추가 할 수 있습니다. NSParameterAssert (self.tableView.allowsSelection);
Nikolay Shubenkov

tableView.rx.itemSelected.subscribe가 콜백하지 않은 사람들을 위해, 이것은 문제이며 위의 수정 작업
Dhilip

그래서 도움 당신은 몇 가지 코드베이스를 인수하며 🙄 스토리 보드에서 비활성화이 선택으로, didSelectRow을 태그 버튼을 사용하여 코드가 아닌 경우
니틴 Alabur

이 tableView 기본 동작입니까?
Frostmourne

296

또 다른 가능성은 다음과 같이 UITapGestureRecognizer가 이벤트를 먹을 수 있다는 것입니다. https://stackoverflow.com/a/9248827/214070

탭 셀이 통과하는 것처럼 테이블 셀이 여전히 파란색으로 강조 표시 되므로이 원인을 의심하지 않았습니다.


이것은 내 문제였다! 정말 고맙습니다!! 이전에는 분명히 효과가 있었지만 UITapGestureRecognizer를 구현 한 후 작동이 중지되었습니다. * tap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (dismissKeyboard)]; [self.view addGestureRecognizer : tap];
coolcool1994

26
@ coolcool1994가 구현 한 것과 같은 문제가있었습니다. [tap setCancelsTouchesInView : NO]; 문제를 해결했습니다.
nizx

감사합니다. 내 경우 didSelectRowAtIndexPath에는에서 셀을 삭제 한 후에 만 ​​작동하지 않습니다 commitEditingStyle. 그럼 내가 할 UITapGestureRecognizer과에 tapAction:있어 indexPath에서 sender.view( [self.tableView indexPathForCell:sender.view])와 전화[self.tableView.delegate didSelectRowAtIndexPath:myIndexPath]
Alexmelyon

1
이것은 내 문제이기도 .. tableview에서 tapgesture를 제거하는 코드를 추가하고 매력처럼 작동했습니다-(UITableViewCell *) tableView : (UITableView *) tableView cellForRowAtIndexPath : (NSIndexPath *) indexPath {UITapGestureRecognizer * gesture = [[UITapGestureRecognizer alloc ] init]; gesture.cancelsTouchesInView = 아니요; [self.tableView addGestureRecognizer : gesture]; }
Udaya 스리

6
감사합니다 @nizx, 빠른 4 tap.cancelsTouchesInView = false
Ariven Nadar

150

모든 좋은 답변이지만 찾아야 할 것이 하나 더 있습니다 ...

(특히 프로그래밍 방식으로 UITableView를 만들 때)

tableView가로 설정된 [tableView setAllowsSelection:YES];행을 설정 하거나 제거 하여 선택에 응답 할 수 있는지 확인하십시오 NO.


9
setAllowsSelectionDuringEditing:목록에 추가하고 싶습니다 (테이블 뷰가 편집 모드 일 때)
alex-i

감사합니다! IB에서는 "선택"섹션 값을로 변경해야했습니다 Single Selection.
Sasho

90

문제가 발생 UITapGestureRecognizer하면이를 해결할 수 있습니다.

  • 스토리 보드에서 :

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

코드와 함께 Objective-C:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
[self.view addGestureRecognizer:tap];

[tap setCancelsTouchesInView:NO];

코드와 함께 Swift:

let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard"))
view.addGestureRecognizer(tap)

tap.cancelsTouchesInView = false

67

이 상황에서 두 가지가 발생했습니다.

  1. UITableViewDelegate 프로토콜을 구현하지 않았거나 클래스와 테이블 뷰 사이에 위임 콘센트가 없습니다.

  2. 행 내부에 첫 번째 응답자이며 클릭 수를 없애는 UIView가있을 수 있습니다. UIButton 또는 이와 유사한 것을 말하십시오.


5
iOS 7에서 발생하기 시작했는데 contentView 내에서 "사용자 상호 작용 사용"이 비활성화되어 문제가 해결되었습니다.
Kof

1
@Kof는 그것을 못 박았다. Xcode 5의 인터페이스 빌더에서 UITableViewCell을 작성하면 사용자 상호 작용이 활성화 된 = YES로 작성됩니다. 나쁜 Xcode 5!
jsd

44

나는 같은 문제가 있었다. 그리고 찾기가 어려웠습니다. 그러나 내 코드 어딘가에는 다음이있었습니다.

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    return nil;
}

그것은해야 return indexPath, 다른 -tableView:didSelectRowAtIndexPath:호출되지 않습니다.


2
IndexPath에서 SelectRow에 대한 올바른 서명은 다음과 같습니다.-(void) tableView : (UITableView *) tableView didSelectRowAtIndexPath : (NSIndexPath *) indexPath {
coolcool1994

나는 완전히 willSelectRowAtIndexPath을 삭제할 때까지 didSelectRowAtIndexPath : 나를 위해, 그것은있는 tableView를 호출 시작되지 것
etayluz

38

UITableView 위에 gestureRecognizer를 추가 didSelectRowAtIndexPath하면 호출되지 않습니다.

따라서 특정보기에서 터치를 피하려면 gestureRecognizer 델리게이트 메소드를 사용해야합니다.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:YourTable]) {
        return NO;
    }
    return YES;
}

3
if ([touch.view isDescendantOfView:YourTable])
Sudheesh

29

몇 달 동안 코드를 보지 않고 문제가 발생하여 필요하지 않은 일부 요구 사항으로 인해 다음 방법을 구현하는 것을 잊었습니다.

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath  *)indexPath{
    return NO;
}

행을 선택하려면 YES를 리턴해야합니다.


24

이 옵션을 선택해야합니다

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

그러나 UITableView클릭시 강조 표시하지 않으 려면 UITableViewCell속성 을 변경해야 합니다.

아래와 같이 선택에 대해 없음 옵션을 선택하십시오.

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


20

전화 UITapGestureRecognizer가 걸리지 않도록 키보드를 해제하기 위해 테이블보기를 사용했습니다 didSelectRowAtIndexPath:. 그것이 누군가를 돕기를 바랍니다.



19

나는 같은 문제가 있었다

이유는를 사용하고 UITapGestureRecognizer있었습니다. 다른 곳을 탭했을 때 키보드가 사라지 길 원했습니다. 나는 이것이 모든 탭 동작을 무시한다는 것을 깨달았습니다. 그것이 didSelectRowAtIndexPath함수가 호출되지 않은 이유 입니다.

와 관련된 행을 주석 처리하면 UITapGestureRecognizer작동합니다. 또한 UITapGestureRecognizer selector탭핑 여부의 기능을 확인할 수 있습니다 UITableViewCell.


14

필자의 경우, didSelctRowAtIndexPath가 호출하지 않기 때문에 tableView 의 Selection 속성 에서 아무것도 선택 하지 않았기 때문에 단일 선택으로 설정하면 문제가 해결되었습니다.

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


11

Xcode 6.4의 경우 Swift 1.2 선택 "태그"가 IB에서 변경되었습니다. 방법과 이유를 모르겠습니다. "단일 선택"으로 설정하면 테이블 뷰 셀을 다시 선택할 수 있습니다. 여기에 이미지 설명을 입력하십시오


10

다른 답변이 접수되었지만이 문제를 관찰하는 사람들을 위해 가능한 한 가지 문제와 해결책을 추가하겠습니다.

ARC (Automatic Reference Counting)를 설정 한 경우 컨트롤러를보기의 대리자로 할당 한 후에도 ARC가 컨트롤러를 삭제하기 때문에 컨트롤러에 대한보기 메시지가 수신되지 않을 수 있습니다. 분명히 UITableView의 델리게이트 포인터는 ARC에 대한 참조로 계산되지 않으므로 이것이 ARC에 대한 유일한 참조 인 경우 컨트롤러의 할당이 해제됩니다. 컨트롤러에서 dealloc 메소드를 구현하고 여기에서 중단 점 또는 NSLog 호출을 설정하여 이러한 상황이 발생하는지 확인할 수 있습니다.

해결책은 더 이상 필요하지 않을 때까지 다른 곳에서 컨트롤러를 강력한 참조로 추적하는 것입니다.


보기가 여전히 표시되는 동안 가비지 수집되는 컨트롤러? 이것이 실제로 일어날 수 있습니까?
Drux

@Drux Yep! 이것이 나에게 일어 났을 때 iOS에서 가비지 수집이 사용 된 Obj-C의 거의 첫 번째 버전이었고 솔직히 훌륭한 일을하지 못했습니다. 많은 참고 문헌은 IMO가 강력해야했던 명시 적 또는 암시 적으로 "약한"것이었다. 이로 인해 디스플레이 레이어에서 활발하게 사용되는 객체의 가비지 수집과 같은 문제가 발생했습니다. 나는 한동안 iOS 작업을 수행하지 않았으므로 이것이 최신 버전에서 여전히 발생하는지 전혀 모른다.
Andrew Gorcester

내 코드는 메모리 크기 문제가 증가하고 있으며이 didSelect 직후 코드의 다른 부분과 코드의 다른 부분을 수정했습니다. 처음으로 호출되지 않습니다. 나는 이것이 문제를 정당화하는지 아닌지 모른다.
Amber K

10

다음과 같이 viewDidLoad 메소드에서 데이터 소스 및 위임을 설정해야합니다.

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];

데이터 소스를 호출했지만 위임하지 않았습니다 ... 감사합니다!
Gmeister4

9

내 문제는 위의 어느 것도 아니 었습니다. 그리고 절름발이. 그러나 나는 누군가를 도울 수 있도록 여기에 나열 할 것이라고 생각했습니다.

나는이 tableViewController내 "기본"컨트롤러 그 후, 나는이 컨트롤러의 하위 클래스를 만들 수 있습니다. tableView:didSelectRowAtIndexPath"기본"클래스 의 루틴에서 모든 코드를 작성하고있었습니다 . 기본적 으로이 루틴은 모든 하위 클래스에서도 (아무것도하지 않은 코드는 있음)도 만들어 졌다는 것을 완전히 잊어 버렸습니다. 그래서 앱을 실행할 때 하위 클래스 버전의 코드를 실행하고 아무것도하지 않았으며 나를 슬프게했습니다. 물론, 일단 서브 클래스에서 루틴을 제거한 후에는 mt "base"클래스 루틴을 사용했으며 비즈니스에 종사하고 있습니다.

알아. 웃지 마 하지만 어쩌면 이것은 내가 잃어버린 시간을 누군가를 구할 것입니다 ...


8

이것에 내 2 센트를 제공합니다.

사용자 정의 UITableViewCell이 있었고 전체 셀을 덮는 버튼이 있었으므로 터치가 발생했을 때 셀이 아닌 버튼이 선택되었습니다.

버튼을 제거하거나 제 경우에는 셀에서 선택한 것과 같은 방식으로 버튼에서 User Interation Enable을 false로 설정했습니다.


8

이것을 읽으면 여전히 문제가 해결되지 않습니다.

내가 가진 사용자 정의 체크 박스 "셀 사용 가능 사용자 상호 작용이 "해제되었다. 그래서 그냥 켭니다. 행운을 빕니다.


7

난 그냥이 있었고 방법을 추가하려고 할 때 내가 자동 완성하지 않도록주의를 기울를했고, 실제로 구현 결국 때문에 그것은 작동하지 않았다 과거에 나에게 일어난 tableView:didDeselectRowAtIndexPath: 대신 tableView:didSelectRowAtIndexPath:.


7

구현 tableView:didSelectRowAtIndexPath하지 않았는지 확인하십시오.tableView:didDeSelectRowAtIndexPath

이것은 몇 번 이상 나를 받았습니다!


5

나는 오래되었고 문제가 해결되었다는 것을 알고 있지만 비슷한 문제가 있었다. 문제는 내 사용자 정의 UITableViewCell과 관련이 있다고 생각했지만 솔루션은 완전히 다릅니다 .XCode를 다시 시작합니다 :) 그런 다음 정상적으로 작동합니다! 거의 Windows처럼 :)


5

테이블 뷰 편집 모드에있는 경우 (예. [tableView setEditing:YES animated:NO];), 당신은 설정해야합니다tableView.allowsSelectionDuringEditing = YES;


4

당신이 할 수있는 또 다른 실수 : 내가 한 것처럼 셀에 segue를 설정하면 didSelectRowAtIndexPath호출되지 않습니다. 대신 뷰 컨트롤러에서 segue를 설정해야합니다.


4

이 답변들 중 어느 것도 나를 위해 일하지 않았습니다. 약 한 시간 후, 나는 매우 교활한 것을 알아 냈습니다.

다른 테이블 뷰의 셀 안에 테이블 뷰가 있습니다. 내부 테이블 뷰를 포함하는 인클로저 뷰를 만들기로 결정했습니다. 이 view contentView를 호출하여 xib에 연결했습니다.

UITableViewCell에 이미 contentView가 있으며 이상한 일이 발생합니다. 속성의 이름을 mainContentView로 바꾸고이 이름이 바뀐 속성에 뷰를 다시 연결하면 문제가 해결되었습니다.


4

내 경우 에는로드 시간 TableView의 높이를 동적으로 계산합니다 SuperView. 계산 오류로 인해의 TableView외부에 위치했습니다 SuperView. 는 TableView그러나 모든 상호 작용이 불가능했다, 벌금을 그려 (및 didSelectRowAtIndexPath호출되지 않았다). TableView"액세스 할 수 없음" 이라는 시각적 표시가 없기 때문에 감지하기가 매우 어렵습니다 .


4

필자의 경우 문제는 UITableViewCell서브 클래스 가 있었고이 두 가지 방법을 구현했습니다 : touchesBegan:withEvent:& touchesEnded:withEvent멋진 애니메이션을 처리하는 것입니다. 그러나 [super touchesBegan:touches withEvent:event];메소드 [super touchesEnded:touches withEvent:event];셀 을 추가하여 셀의 부모에게 터치를 알리는 것을 잊었습니다 .

따라서 코드를 다음과 같이 변경하면 문제가 해결되었습니다.

-(void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event{
    [super touchesBegan:touches withEvent:event];
    //blah blah blah
}

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesEnded:touches withEvent:event];
    //rest of the code
}

1
이것은 특히 나를 위해 OP의 문제의 원인을 확인 할 수
조쉬 울프

4

필자의 경우 솔루션은 아래 함수에서 NO를 YES로 변경하는 것이 었습니다.

iOS 9 이상

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

이것은 나의 문제이기도했다. 다중 tableView 구현이 있으며이 메소드에서 두 tableView를 분리하는 것을 잊었습니다.
turingtest
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.