-didSelectRowAtIndexPath:未被调用

我正在编写一个iOS应用程序,并在选项卡视图中显示表格视图。 在我的UITableViewController ,我实现了-tableView:didSelectRowAtIndexPath:但是当我在运行时select一行时,方法没有被调用。 表视图正在填充,所以我知道我的控制器中的其他tableView方法正在被调用。

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

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

任何你重置委托给其他类的机会?

以防万一有人犯了和我一样愚蠢的错误:

检查一下你所期望的didSelect的方法名称是否可能被意外的didDeselect 。 我花了大约两个小时找出…

可能导致问题的另一件事是不selectselect种类:

UITableView选择种类

应该是Single Selection的正常select, 应该No Selection

另一种可能是UITapGestureRecognizer可能正在吃事件,就像这里的情况一样: https ://stackoverflow.com/a/9248827/214070

我没有怀疑这个原因,因为表格单元仍然会突出显示蓝色,就好像水龙头正在通过。

所有好的答案,但还有一个要注意的…

(特别是当编程创build一个UITableView)

确保tableView可以通过设置[tableView setAllowsSelection:YES];来响应select[tableView setAllowsSelection:YES]; 或者删除将其设置为NO任何行。

如果UITapGestureRecognizer出现问题,您可以解决这个问题:

  • 在Storyboard中:

在这里输入图像描述

  • 在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 

在这种情况下我遇到了两件事情。

  1. 你可能忘了实现UITableViewDelegate协议,或者在你的类和你的表视图之间没有代理sockets。

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

我有同样的问题。 而且很难find。 但在我的代码中的某处是这样的:

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

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

我遇到了一个问题,在几个月没有看我的代码我忘了,我实施了以下方法,由于一些没有必要的要求

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

它应该返回YES是为了使其被选中。

如果您在UITableView的顶部添加了一个gestureRecognizer,则不会调用didSelectRowAtIndexPath

如果是这样的话,您需要使用gestureRecognizer委托方法来避免在特定视图中触摸。

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

你必须select这些选项 在这里输入图像描述

但如果你想使uitableview没有突出点击,那么你应该在UITableViewCell属性中进行更改…select无选项..就像… 在这里输入图像描述

如果你有和我一样的问题:显然,如果你的tableView处于编辑模式,这个方法将不会被调用。 你必须设置allowSelectionDuringEditing为true。

通过这个问题: 编辑时,`UITableView`不会调用didSelectRowAtIndexPath?

我已经把一个UITapGestureRecognizer放在我的表视图来closures阻止didSelectRowAtIndexPath:被调用的键盘。 希望它可以帮助别人。

我有同样的问题,

原因是使用UITapGestureRecognizer 。 当我点击其他地方时,我想让键盘解散。 我意识到,这覆盖了所有的水龙头行动,这就是为什么, didSelectRowAtIndexPath函数没有调用。

当我评论与UITapGestureRecognizer有关的UITapGestureRecognizer ,它是有效的。 此外,你可以检查UITapGestureRecognizer selector的function,如果轻拍是UITableViewCell或没有。

对于Xcode 6.4,Swift 1.2。 IB中的select“标签”已被更改。 我不知道如何和为什么。 将其设置为“单选”使我的表格视图单元格再次可选。 在这里输入图像描述

即使另一个答案已经被接受,我会为观察这个问题的人添加一个可能的问题和解决scheme:

如果您打开了自动引用计数(ARC),您可能会发现,即使在将控制器作为视图的代理分配之后,由于ARC正在删除控制器,所以未收到控制器的视图消息。 显然,UITableView的委托指针并不算作ARC的参考,所以如果这是唯一的参考,控制器将被解除分配。 您可以通过在控制器上实现dealloc方法并在那里设置断点或NSLog调用来validation是否发生了这种情况。

解决的办法是跟踪控制器在其他地方的强大的参考,直到你确定你不会再需要它。

我的问题是以上都不是。 跛脚 但是我想我会在这里列出它,以便帮助某人。

我有一个tableViewController是我的“基础”控制器,然后创build此控制器的子类。 我在“base”类中的tableView:didSelectRowAtIndexPath例程中写了我所有的代码。 完全忘记了这个例程在我所有的子类中也被创build了(虽然没有任何代码)。 所以当我运行我的应用程序时,它运行了代码的子类版本,什么都没做,让我感到难过。 所以当然,一旦我从子类中删除例程,它就使用mt“base”类例程,而且我正在运行。

我知道。 别笑。 但是,也许这会在我失去的时候拯救一个人。

给我2分这一点。

我有一个自定义UITableViewCell,并有一个覆盖整个单元格的button,所以当触摸发生时,button被选中,而不是单元格。

要么删除button或在我的情况下,我设置用户互动启用为falsebutton,这样的单元格是选定的一个。

请记住在viewDidLoad方法中设置数据源和委托,如下所示:

 [self.tableView setDelegate:self]; [self.tableView setDataSource:self]; 

我只是有这样的事情发生在我以前它没有工作,因为我没有注意到自动完成时试图添加该方法,我实际上最终实现tableView:didDeselectRowAtIndexPath :而不是tableView:didSelectRowAtIndexPath:

如果你读了这个,那么还是不能解决问题。

我有自定义单元格,其中“禁用用户交互 ”checkbox被禁用。 所以,我只要打开它。 祝你好运。

我知道是老的,问题已经解决,但有一个类似的问题,我认为这个问题是与我的自定义UITableViewCell,但解决scheme是完全不同的 – 我重新启动XCode :)然后工作正常! 几乎像Windows 🙂

这些答案都没有为我工作。 大约一个小时后,我发现了一个非常阴险的东西:

我在另一个表视图的单元格中有一个表视图。 我决定做一个封闭的视图,其中包含内部的表视图。 我把这个视图称为contentView,并把它连接到xib中。

事实certificate,UITableViewCell已经有一个contentView,并做了奇怪的事情。 当我将属性重命名为mainContentView并将视图重新连接到此重命名的属性时,问题自行解决。

好的,在这里更新,因为我刚刚遇到这个问题,我的问题与这里发现的稍有不同。

我查看了IB,发现我的代理已经设置,但它被错误地设置为查看,而不是文件的所有者(右键单击表视图查看委托指向的位置)。

希望能帮助别人

你可以做的另一个错误(就像我做的那样):如果你在单元格中设置了segue, didSelectRowAtIndexPath不会被调用。 你应该在视图控制器上设置你的segues。

注意故事板中的UITableView属性,在我的情况下发生的事情是,故事板中的combox被选为“Selection:Single Selection”,不允许运行方法didSelectRowAtIndexPath。

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

这可能只是在我的情况,但我已经从备份重新加载一些文件,东西不工作,包括这一点。 完成清洁(产品>清洁或Shift + Command + K)后,它工作。 可能有些东西在预编译头文件中搞砸了。 有机会,这不是你的问题,但它是值得一试。

如果你有一个自定义的单元格,记得在单元格的Xib(或通过代码)中设置UserInteractionEnabled。

检查-heightForRowAtIndexPath是否不返回0。