-didSelectRowAtIndexPath:不会被调用-didSelectRowAtIndex

2019-05-09 08:46发布

我正在写一个标签视图中的表视图中的iOS应用。 在我UITableViewController ,我实现-tableView:didSelectRowAtIndexPath: ,但是当我在运行时选择一排,该方法不会被调用。 表视图被填充,虽然,所以我知道我的控制器其他的tableView方法被调用。

有没有人有什么我可能搞砸了要做到这一点任何想法?

Answer 1:

这听起来像也许类不是UITableViewDelegate为表视图,虽然UITableViewController应该是自动设置。

任何机会,你委托重置为一些其他的课吗?



Answer 2:

万一有人做同样愚蠢的错误,因为我做的:

看看,如果你希望成为什么样的方法名didSelect可能会意外地得到didDeselect以某种方式。 花了约两个小时给我找出来...



Answer 3:

这可能导致问题的另一件事是没有选择的选择类型:

应该是Single Selection正常的选择, 应该是No Selection



Answer 4:

另一种可能性是,UITapGestureRecognizer可能是吃的事件,这里曾是如此: https://stackoverflow.com/a/9248827/214070

我不怀疑这个原因,因为表格单元格将仍然突出蓝色好像水龙头被打通。



Answer 5:

所有好的答案,但是有一个更看出来的?

(特别是编程方式创建一个UITableView时)

确保的tableView可以通过设置来选择响应[tableView setAllowsSelection:YES]; 或去除其设置为任何线NO



Answer 6:

如果问题出现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


Answer 7:

我在此情况下,遇到了两件事情。

  1. 你可能已经忘记了执行的UITableViewDelegate协议,或有你的类和你的表视图之间没有代表团插座。

  2. 你可能也有行内一个UIView是第一个响应,并把你的点击。 说一个UIButton或类似的东西。



Answer 8:

我曾经也有过一样的问题。 而这是很难找到。 但地方在我的代码是这样的:

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

必须return indexPath ,否则-tableView:didSelectRowAtIndexPath:不会被调用。



Answer 9:

如果您在UITableView的顶部增加了一个gestureRecognizer, didSelectRowAtIndexPath将不会被调用。

所以,你需要使用gestureRecognizer委托方法,以避免在特定视图触摸。

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


Answer 10:

我这里不是在看我的代码,我忘了,我采取了以下方法个月后,遇到了一个问题,由于一些要求,这是没有必要的

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

它应以使其选择被返回的是一排。



Answer 11:

您必须选择这些选项

但如果你想UITableView不突出的点击,那么你应该在变化UITableViewCell属性。

选择的选择,就像下面无选项



Answer 12:

我已经把一个UITapGestureRecognizer我的表视图驳回其防止键盘didSelectRowAtIndexPath:从被调用。 希望它可以帮助别人。



Answer 13:

如果你有同样的问题我:很显然,这种方法不会,如果你的的tableView是在编辑模式下调用。 你必须allowsSelectionDuringEditing设置为true。

通过这样的问题: 当编辑,`UITableView`不调用didSelectRowAtIndexPath方法?



Answer 14:

我有同样的问题,

究其原因是使用的UITapGestureRecognizer 。 我想键盘解雇时,我拍了拍其他地方。 我意识到,这将覆盖所有水龙头的动作,这就是为什么, didSelectRowAtIndexPath函数没有被调用。

当我评论与相关的行UITapGestureRecognizer ,它的工作原理。 此外,您可以在功能检查UITapGestureRecognizer selector ,如果抽头是UITableViewCell与否。



Answer 15:

对于Xcode的6.4,1.2雨燕。 选择“标签”已在IB被改变。 我不知道如何和为什么。 将其设置为“Single选择”再次选择了我的表视图细胞。



Answer 16:

在我而言,didSelctRowAtIndexPath不是要求是由于我在的tableView的选择物业选择 ,设置为单一选择解决我的问题



Answer 17:

尽管另一种答案已被接受,我会多加一个可能出现的问题和谁观察这个问题的人的解决方案:

如果有自动引用计数(ARC)开启时,你可能会发现,即使是作为视图的代表分配控制器后,都没有收到该视图的控制器消息,因为ARC被删除控制器。 显然的UITableView的委托指针不能算作对于ARC的参考,因此,如果这是它的唯一参考,控制器将被dealloc'd。 您可以验证这是否是通过实现控制器上的dealloc方法和设置断点或调用的NSLog有发生。

解决的办法是跟踪控制器具有较强的参考别的地方,直到你确信你将不再需要它。



Answer 18:

记得设置在viewDidLoad方法的数据源和委托,如下所示:

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];


Answer 19:

My problem was none of the above. And so lame. But I thought I would list it here in case it helps someone.

I have a tableViewController that is my "base" controller and then I create subclasses of this controller. I was writing all my code in the tableView:didSelectRowAtIndexPath routine in the "base" class. Completely forgetting that by default this routine had also been created (albeit with no code that did anything) in all of my subclasses as well. So when I ran my app, it ran the subclass version of the code, did nothing, and made me sad. So of course, once I removed the routine from the subclasses, it used mt "base" class routine and I'm in business.

I know. Don't laugh. But maybe this will save someone the hour I lost...



Answer 20:

给这个我的2美分。

我有一个自定义的UITableViewCell并有覆盖整个小区的按钮,所以当触摸发生,被选择的按钮,而不是细胞。

要么删除按钮或在我的情况,我设置用户互为作用使假按钮,这样的小区是一个选择。



Answer 21:

如果你读了这一点,所以仍然没有解决问题。

我有自定义单元格,在这里勾选“ 启用用户交互 ”为禁用。 所以,我就打开它。 祝好运。



Answer 22:

我只是有这和发生在我身上,在过去它没有工作,因为我尝试添加的方法时没注意自动完成,我实际上最终实现tableView:didDeselectRowAtIndexPath代替: tableView:didSelectRowAtIndexPath:



Answer 23:

我知道是老问题得到解决,但也有类似的问题,我认为这个问题是我的自定义的UITableViewCell,但解决方案是完全不同 - 我重新启动的XCode :),然后工程确定! 几乎像Windows :)



Answer 24:

如果您的表视图在编辑模式(如: [tableView setEditing:YES animated:NO];你需要设置tableView.allowsSelectionDuringEditing = YES;



Answer 25:

你可以做了(像我一样),另一个错误:如果设置在小区一个SEGUE, didSelectRowAtIndexPath不叫。 你应该在视图控制器设置你的塞格斯代替。



Answer 26:

这些答案都不为我工作。 大约一个小时后,我想通了一些非常阴险的:

我还有一个表视图的单元格中的表视图。 我决定做一个包含内表视图,除其他事项外一个封闭的视图。 我称这种观点内容查看,并在厦门国际银行迷上它。

原来,的UITableViewCell已经有一个内容查看,并做奇怪的事情吧。 该问题自行解决,当我改名属性mainContentView并重新连接认为这个重命名属性。



Answer 27:

就我而言,我动态计算的高度TableViewSuperView在加载时间。 由于计算错误,将TableView被放置在外面SuperView 。 该TableView绘制精细,但是所有交互被禁用(和didSelectRowAtIndexPath从未调用)。 防不胜防,因为没有视觉指示TableView不是“访问”。



Answer 28:

在我的情况的解决方案是在下面的函数NO改为YES。

iOS版9+

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


Answer 29:

请确保你实施tableView:didSelectRowAtIndexPath ,而不是tableView:didDeSelectRowAtIndexPath

这是我得到了比上几次多!



Answer 30:

好吧,这里更新我只是碰到了这个问题,我的问题是不是在这里找到略有不同。

我看着在IB,看到我的委托成立,但它是设置不当来查看,而不是文件所有者(右键单击表视图看到委托指向)。

希望可以帮助别人



文章来源: -didSelectRowAtIndexPath: not being called