357

我有一个问题UITableView's didSelectRowAtIndexPath

我的表已设置,因此当我选择行时,它会初始化一个新的视图控制器并推送它。

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

我已经通过在didSelectRowAtIndexPath. 向该方法添加一个NSLog时,我看到当我选择最终推送新视图控制器的第二行时,我看到两个日志语句同时出现在控制台中。

有什么建议么?

4

16 回答 16

1372

您是否有任何机会不小心输入了De selectRowAtIndexPath?

于 2010-01-21T02:17:06.767 回答
24

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

于 2012-11-29T10:05:28.910 回答
17

我遇到了以下问题:

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

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

在此处输入图像描述

希望对某人有所帮助

于 2015-01-23T17:50:42.040 回答
13

检查您是否在班级中设置了任何手势识别器。删除手势对我有用。

于 2015-10-12T07:37:52.143 回答
7

我什至争论过发布这个答案,因为我认为星星有点对齐,以便表现出来。

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

于 2014-01-31T20:30:37.543 回答
5

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

我终于打电话了

[tableView deselectRowAtIndexPath:indexPath animated:NO];

第一件事

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

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

于 2016-07-20T12:48:12.220 回答
2

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

于 2018-07-09T15:45:32.287 回答
1

斯威夫特 2

确保您将此设置为 true:

self.tableView.allowsSelection = true

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

于 2015-11-20T15:20:52.893 回答
1

斯威夫特 3

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

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

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

于 2016-10-06T14:21:40.800 回答
1

斯威夫特 3

在我的情况下,其他答案都不起作用,对我来说解决的是:

tableView.delaysContentTouches = false

于 2017-12-21T15:51:27.563 回答
1

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

[tableView deselectRowAtIndexPath:indexPath animated:NO];

这对我有用。

于 2018-01-19T08:00:26.903 回答
1

斯威夫特 4.2

在属性检查器中禁用“延迟着陆”解决了这个问题。
之后点击很流畅,didSelectRowAt 立即触发。

XCode 属性检查器

于 2019-06-05T17:46:51.553 回答
0

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

于 2017-04-18T11:24:19.400 回答
0

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

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

于 2019-04-29T09:06:53.047 回答
0

对我有用的是开始输入“didSelect ...”,然后让自动更正填写其余部分。显然我的语法的一些细节是不稳定的。正如其他人所说,使用IDE!

于 2019-08-12T19:54:01.113 回答
0

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

如果allowsMultipleSelection设置为truetable view 选择机制将改变方式,即通过选择每个单元格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")
    }
于 2020-08-15T08:15:33.913 回答