UITableView didSelectRowAtIndexPath:第一次点击时没有调用

问题描述 投票:348回答:14

我和UITableView's didSelectRowAtIndexPath有问题。

我的表是设置的,所以当我选择行时,它会初始化一个新的视图控制器并将其推送。

我第一次点击表中的任何一行时,该方法不会被调用。一旦我选择了另一行,它就会开始正常工作。

我已经通过在didSelectRowAtIndexPath上设置断点来验证这一点。在向方法添加NSLog时,我看到当我选择最后推送新视图控制器的第二行时,我看到同时在控制台中出现两个日志语句。

有什么建议?

uitableview cocoa-touch uikit didselectrowatindexpath
14个回答
1335
投票

您是否偶然输入了didDeselectRowAtIndexPath?


1
投票

当你在tableView中使用手势识别器时也会发生这个问题,在这种情况下你不需要删除它们,你只需要确保你的手势属性cancelsTouchesInView = false这是一个布尔值,影响触摸是否传递给一个视图当手势被识别时。


0
投票

SWIFT 3

在我的案例中没有其他答案有效,为我修复的是:

tableView.delaysContentTouches = false


0
投票

在第一次或第二次点击我的应用程序时没有调用didSelectRowAt函数...我试图解决问题找不到任何解决方案。但我突然意识到,我正在使用view.animation颜色变化...动画持续时没有调用Delegate方法


0
投票

在我的情况下,我有一个带手势识别器的UITableView部分标题。当点击标题时,它应该在该部分插入几行并为插入设置动画(如展开/折叠部分)。第一次展开和点击时,未触发didSelectRow委托方法。对于进一步的点击和展开/折叠操作,它按预期工作。

根据@Ayoub Nouri的回答,我将cancelsTouchesInView设置为false,这解决了这个问题。 tapGestureRecognizer?.cancelsTouchesInView = false


0
投票

Swift 4.2

在属性检查器中禁用“延迟触摸”可解决此问题。 之后点击是平滑的,并且didSelectRowAt会立即触发。

XCode attributes inspector


24
投票

还要检查xib文件中表视图的selection属性。根据需要使用“单选”或“多选”。


17
投票

我遇到了以下问题:

  • 第一次点击 - >没有效果,没有选择,从不
  • 第二次点击并跟随 - >正确的选择行为

就我而言,我的错误是在Interface Builder中检查Show Selection on Touch。您可以在IB中取消选中它:

希望能帮助别人


11
投票

检查您是否在课堂上设置了任何手势识别器。删除手势对我有用。


6
投票

我甚至在发表这个答案时进行了辩论,因为我认为这些星星有点对齐以便能够表现出来。

我有这个问题的变化,并检查了其他解决方案。在我的表格视图中,它没有在第一次点击时处理我表格的最后一行。它突出了它,但didSelectRowAtIndexPath没有被称为。所有其他行都可以正常工作。但是,如果我将tableview反弹,那么它似乎可以解决问题(但是你必须处理一个tableview反弹)。


4
投票

为显示该问题的单元格设置了UITableViewCellSelectionStyleNone(ios9)。

我最后打电话了

[tableView deselectRowAtIndexPath:indexPath animated:NO];

第一件事

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

这是不一样的,但足够好。让我想知道ios10带来了什么样的桌面破损。


1
投票

SWIFT 2

确保将此设置为true:

self.tableView.allowsSelection = true

在你的viewDidLoad()之后和super.viewDidLoad()之前把它放在你的右边


1
投票

SWIFT 3

如果你在一个不是UITableViewController的类中使用Swift 3而你正在使用UITableViewDelegate,那么你可能需要使用方法标题:

@objc(tableView:didSelectRowAtIndexPath:) func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){...}

这对我有用,虽然我刚刚将我的项目迁移到Swift 3.这是相当新的,所以这可能会在以后解决。


1
投票

如果您在类中设置了任何UITapGestureRecognizer,则可以在didSelectRowAtIndexPath中添加以下行:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

这对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.