UITableView didSelectRowAtIndexPath:第一次点击时不被调用

我有一个问题与UITableView's didSelectRowAtIndexPath

我的表已经设置好了,所以当我选择row时,它会初始化一个新的视图控制器并推送它。

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

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

有什么建议吗?

59790 次浏览

有没有可能你不小心输入了didselectRowAtIndexPath?

也检查xib文件中表视图的选择属性。按需要使用“单选”或“多选”。

我甚至对张贴这个答案进行了辩论,因为我认为为了证明这一点,星星有点对准了。

我有这个问题的变化,并检查了其他解决方案。在我的表视图中,它不是在第一次点击时处理表的最后一行。它突出显示它,但didSelectRowAtIndexPath没有被调用。其他行都没问题。但如果我打开tableviewbounce,问题似乎就解决了(但你必须处理tableviewbounce)

我遇到了以下问题:

  • 第一次点击行->没有效果,没有选择,从来没有
  • 第二次点击和下面->正确的选择行为,总是

在我的情况下,我的错误是检查接口生成器中的Show Selection on Touch。你可以在IB中取消勾选:

enter image description here

希望这能帮助到别人

检查是否在类中设置了任何手势识别器。移动手势对我有用。

斯威夫特2

确保你把这个设置为true:

self.tableView.allowsSelection = true

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

UITableViewCellSelectionStyleNone为显示该问题的单元格设置 (ios9)。< / p >

我最后还是打了个电话

[tableView deselectRowAtIndexPath:indexPath animated:NO];

首先

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

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

斯威夫特3

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

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

这对我来说很有效,尽管我刚刚将我的项目迁移到Swift 3。这是一个相当新的问题,所以稍后可能会修复。

didSelectRowAt函数没有在我的应用程序中第一次或第二次点击… 我试图解决这个问题却找不到任何解决方法。但突然间我意识到,我用的是视图。动画颜色变化…Delegate方法在动画持续时未被调用

斯威夫特3

其他的答案都不适合我,让我解决问题的是:

tableView.delaysContentTouches = false

如果你在你的类中设置了任何UITapGestureRecognizer,你可以在你的didSelectRowAtIndexPath中添加这一行:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

这对我很管用。

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

在我的例子中,我有一个带有手势识别器的UITableView节头。当点击标题时,它应该在该部分中插入几行,并使插入动画化(如展开/折叠部分)。 第一次展开和点击时,didSelectRow委托方法没有被触发。对于进一步的点击和展开/折叠操作,它正在按照预期工作

每个答案由@Ayoub努里·我设置cancelsTouchesInView为false,这解决了问题。 tapGestureRecognizer ?。cancelsTouchesInView = false

斯威夫特4.2

在属性检查器中禁用“延迟着陆”解决了这个问题 在此之后,点击是平滑的,didSelectRowAt立即触发

XCode属性检查器

对我来说有用的是开始输入“didSelect…”,然后让自动更正填充剩下的部分。显然我的一些语法细节是不可靠的。正如其他人所说,使用IDE!!

我在tableView上也有同样的问题(swift 4.2),它可以用tableView上的allowsMultipleSelection属性来修复。

如果allowsMultipleSelection被设置为true,表视图的选择机制将发生改变,通过选择每个单元格,第一次调用tableView didSelectRowAtIndexPath:,通过选择相同的单元格,第二次调用tableView didDeselectRowAtIndexPath:

这意味着如果一个单元格被点击的次数是奇数(1,3,5,…),那么总是tableView didSelectRowAtIndexPath:将被调用,如果一个单元格被点击的次数是偶数(2,4,6,…),那么总是tableView didDeselectRowAtIndexPath:将被调用。

这使得tableView didSelectRowAtIndexPath:函数在同一单元格的第三次选择时被调用,因此结果是双击调用didSelectRowAtIndexPath:!!

如果你想在单元格的每个选择上调用tableView didSelectRowAtIndexPath:,那么tableView多重选择必须设置为falsetableView.allowsMultipleSelection = false

这样,每当单元格被点击时,tableView didSelectRowAtIndexPath:将在表视图中被调用,通过选择另一个单元格,之前选择的单元格将被调用tableView didDeselectRowAtIndexPath:,然后新选择的单元格将被调用tableView didSelectRowAtIndexPath:

    class TableViewController: UITableViewController {
    

override func viewDidLoad() {
super.viewDidLoad()


tableView.allowsMultipleSelection = false
}


override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("This will be called for each cell tap")
}