ChatGPT解决这个技术问题 Extra ChatGPT

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

UITableView's didSelectRowAtIndexPath 有问题。

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

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

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

有什么建议么?

您可以发布 tableView:didSelectRowAtIndexPath: 的代码吗?
我有同样的问题,检查我的答案:stackoverflow.com/a/44097559/1600061
主队列中的调度解决了我的问题stackoverflow.com/questions/20149167/…

O
Ole Begemann

您是否有可能不小心输入了 didDeselectRowAtIndexPath?


@Dschee 在第一次点击时不会调用它,因为您没有取消选择任何内容。一旦您选择了一行,当您尝试选择第二行时,第一行将被取消选择。
这就是我如此喜欢的原因。
我对此表示赞同,不是因为我曾经犯过这个错误。我投了赞成票,因为我在这么多年里犯了不少于 4 次这个错误,花费了这么多时间。
我的天啊!!这可能是我在代码中引入的最严重的错误。
哇。节省了我很多时间。
i
includeMe

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


哈哈哈哈!哇,我花了 4 个小时试图弄清楚这一点。 @includeMe 来救援(敬礼)!谢谢!
s
sonxurxo

我遇到了以下问题:

第一次点击行 -> 没有效果,没有选择,从不

第二次点击并关注 -> 正确的选择行为,总是

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

https://i.stack.imgur.com/WX3bQ.png

希望对某人有所帮助


你是我的英雄!知道为什么这是默认设置吗?我想不出任何有这种行为的应用程序,我认为这是一个非常奇怪的默认值。
Y
YSR fan

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


我都有;手势识别器和 didSelectRowAtIndexPath?然而,手势识别器总是优先考虑。无法进入第二个。有没有办法同时处理这两种情况,还是我必须摆脱手势识别器?谢谢!
这一定是最重要的 :) 在 iOS 开发 7 年后花了我 1 小时。
它花了我一个多小时......同意,它应该在顶部!谢谢@YSR 粉丝
C
Chase Roberts

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

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


您找到发生这种情况的原因了吗?我有完全相同的问题。当我关闭表格弹跳时,表格中的第一行/最后一行不会在第一次点击时做出反应。我认为这是错误,但它已经超过一年了,它仍然在发生。
不,我只是打开了 tableview 弹跳,然后就离开了。
我只在 iPhone 5(iOS 10.3)上遇到了这个问题——在我的 tableview 上打开弹跳修复了它。很奇怪!
由于系统错误/错误功能,由于安装在按钮上的系统 GestureRecognizers,屏幕底部的按钮无法正确触发。在此处修复:stackoverflow.com/questions/23046539/…
A
Anton Tropashko

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

我终于打电话了

[tableView deselectRowAtIndexPath:indexPath animated:NO];

第一件事

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

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


这对我有用,但我需要一种解决方法来隐藏选择而不使其样式为无。我确实覆盖了 setSelected,但是当用户拿着单元格时,出现的选择是不可接受的
A
Ayoub Nouri

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


我在手势内使用表格视图。根据动画要求,我必须这样做。所以我也面临同样的问题。我必须在第一次点击两次才能选择行。使用gesture.cancelsTouchesInView = false后得到解决谢谢。
L
Lukesivi

斯威夫特 2

确保您将此设置为 true:

self.tableView.allowsSelection = true

将其放在您的右侧上方 viewDidLoad()super.viewDidLoad() 之前


Z
ZGski

斯威夫特 3

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

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

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


D
Diogo Martins

斯威夫特 3

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

tableView.delaysContentTouches = false


g
garridozh

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

[tableView deselectRowAtIndexPath:indexPath animated:NO];

这对我有用。


A
Aviv Mor

斯威夫特 4.2

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

https://i.stack.imgur.com/AGnGH.png


R
Rishil Patel

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


K
Kabeer

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

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


s
safari yellow

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


A
Amir Ehsanijam

我在我的 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")
    }