-didSelectRowAtIndexPath:未被调用
我正在编写一个iOS应用程序,并在选项卡视图中显示表格视图。 在我的UITableViewController
,我实现了-tableView:didSelectRowAtIndexPath:
但是当我在运行时select一行时,方法没有被调用。 表视图正在填充,所以我知道我的控制器中的其他tableView方法正在被调用。
有没有人有任何想法,我可能搞砸了做到这一点?
这听起来像也许该类不是该表视图的UITableViewDelegate
,但UITableViewController
应该自动设置。
任何你重置委托给其他类的机会?
以防万一有人犯了和我一样愚蠢的错误:
检查一下你所期望的didSelect
的方法名称是否可能被意外的didDeselect
。 我花了大约两个小时找出…
可能导致问题的另一件事是不selectselect种类:
应该是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
在这种情况下我遇到了两件事情。
-
你可能忘了实现UITableViewDelegate协议,或者在你的类和你的表视图之间没有代理sockets。
-
你可能在你的行内有一个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。