didSelectRowAtIndexPath:不被调用

我有一个UITableView作为我的UIScrollVIew ,这是由我的MainViewController控制的主视图的子视图。

在MainViewController.h中

 @interface MainViewController : UIViewController <UIGestureRecognizerDelegate, UITableViewDelegate, UITableViewDataSource> // other stuff here... @property (weak, nonatomic) IBOutlet UITableView *myTableView; 

在MainViewController.m中

 @synthesize myTableView; // other stuff here... - (void)viewDidLoad { myTableView.delegate = self; myTableView.datasource = self; } // other stuff here... -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath { [self performSegueWithIdentifier:@"listAttributesSegue" sender:self]; } 

我知道didSelectRowAtIndexPath没有被调用,因为我已经在方法本身和其中的代码行设置了断点,并且都没有被调用。 我也知道数据源工作正常,因为我有其他的function,在运行时修改单元格,他们工作得很好。 我正在使用iOS 5.0中最新的Xcode作为开发目标。 我search了一个答案。 有人有主意吗?

编辑:我find了答案。 我有一个UITapGestureRecognizerUITapGestureRecognizer设置。 这超过了select呼叫。 信任谁build议这可能是。 在我将其标记为正确之前,您的回答已被删除。

编辑2:很多人一直在评论这个,所以我虽然我会分享它。 如果您遇到此问题,只需将myGestureRecognizer.cancelsTouchInView设置为false并且一切都应该正常工作。

我find了答案。 我有一个UITapGestureRecognizer为myTableView的superView设置。 这超过了select呼叫。 信任谁build议这可能是。 在我将其标记为正确之前,您的回答已被删除。

将手势识别器中的cancelsTouchesInView属性设置为NO ,以允许表视图拦截事件。

你的问题是区分大小写的。 你的代码:

 - (void)tableVIew:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath { 

应该

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath { 

也许这是一个错字。 检查你的函数是不是didDeselectRowAtIndexPath:select而不是select)。

更新了Swift 3:

如果您在代码中使用了UITapGestureRecognizer: – #Swift 3 使用下面的代码行:

 extension YourViewController{ func hideKeyboardWhenTappedAround() { let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewController.dismissKeyboard)) view.addGestureRecognizer(tap) tap.cancelsTouchesInView = false } func dismissKeyboard() { view.endEditing(true) } } 

如何调用: – 在ViewDidLoad()

 self.hideKeyboardWhenTappedAround() 

你有同名的tableview实例variables吗? 如果不是,那么可能是这个问题 –

 _myTableView.delegate = self; _myTableView.datasource = self; 

要么-

 self.myTableView.delegate = self; self.myTableView.datasource = self; 

我的解决scheme是:

  1. cancelsTouchesInView设置为任何tapGesture的No

  2. 我发现在我的自定义单元格中, userInteractionEnable被设置为NO ,只需删除userInteractionEnable = No并解决问题。

取消其他意见触动除了需要一个。

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch { if (touch.view == your view) { return YES; } return NO; } 

对不起,没有足够的点来添加评论 – 加勒特的答案是伟大的,但我会补充:

你仍然可以拥有你的手势识别器,但是你需要设置“取消触摸视图”为NO – 手势将被交给视图,你的UITableView将正常工作。

尝试了很多之后,很多方法似乎都是正确的做法:“取消触摸视图”的轻触手势识别器就像在抓取所有事件并将其路由到视图控制器的所有事物之上都有一个不可见的层(代理)。 视图控制器然后看着手势,看看它是否有一个动作绑定(button等),并将路由这些和任何剩余的将只是去手势处理程序。 当使用一个UITableView它期望接收轻拍,但视图控制器snaffles它时,你有'取消触摸视图'。

我在这个问题上有一段时间了,在这里我没有看到任何提及,所以作为参考,另一个原因可能是:

 tableView.editing = YES; 

 tableView.allowsSelectionDuringEditing = NO; 

根据文件

 - tableView:didSelectRowAtIndexPath: 

当表格的编辑属性设置为YES(即表格视图处于编辑模式)时,不会调用此方法。 有关此方法的更多信息(和代码示例),请参阅iOS的“表视图编程指南”中的“pipe理select”。

用户可以通过调用“tableView.selectRowAtIndexPath(..)”或“cell.setSelected(true,…)”来select一个单元格(点击该行)。

  • 如果通过调用“cell.setSelected(true)”来select单元格,则用户不能再取消该单元格的select。

  • 如果通过调用“tableView.selectRowAtIndexPath()”来select单元格,则用户可以按预期取消select该单元格。

我的情况很奇怪 我的tableView有2个部分。 第一节的单元格关于tableView:didSelectRowAt:工作正常,但是第二节的单元格不触发didSelectRowAt:

上述问题发生在iPhone 4s, iOS 9.3 。 但在iPhone 5s, iOS 10.3 ,没有问题,这些细胞工作正常。 看起来像iOS 9 UITableView错误。

经过多次testing,我发现一行代码产生这个bug。

 tableView.estimatedSectionHeaderHeight = 60.0 

因为第二部分没有标题视图。 我删除了这一行,所有工作正常。

我有didSelectRowAtIndexPath间歇性失败:在我的自定义单元格按下被调用。

我发现,如果我经常停止调用[tableView reloadData](10 Hz),并将其更改为每2秒更新一次,几乎每个新闻都会成功调用didSelectRowAtIndexPath:

这似乎是重新加载视图块按下。