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

时间:2010-01-21 01:21:42

标签: uitableview cocoa-touch uikit didselectrowatindexpath

我遇到UITableView's didSelectRowAtIndexPath的问题。

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

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

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

有什么建议吗?

16 个答案:

答案 0 :(得分:1330)

您偶然输入的几率 De selectRowAtIndexPath?

答案 1 :(得分:24)

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

答案 2 :(得分:17)

我遇到了以下问题:

  • 首先点击行 - >没有效果,没有选择,从不
  • 第二次点按并关注 - >正确的选择行为,始终

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

enter image description here

希望能帮到某人

答案 3 :(得分:11)

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

答案 4 :(得分:6)

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

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

答案 5 :(得分:4)

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

我最后打电话给

[tableView deselectRowAtIndexPath:indexPath animated:NO];

中的第一件事
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

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

答案 6 :(得分:1)

SWIFT 2

确保将此设置为true:

self.tableView.allowsSelection = true

viewDidLoad()之后和super.viewDidLoad()

之前将其置于右上方

答案 7 :(得分:1)

SWIFT 3

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

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

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

答案 8 :(得分:1)

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

[tableView deselectRowAtIndexPath:indexPath animated:NO];

这对我有用。

答案 9 :(得分:1)

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

答案 10 :(得分:0)

第一次或第二次点击我的应用中未调用

didSelectRowAt功能... 我试图解决问题找不到任何解决方案。但我突然意识到,我正在使用view.animation颜色更改...动画持续时未调用Delegate方法

答案 11 :(得分:0)

SWIFT 3

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

tableView.delaysContentTouches = false

答案 12 :(得分:0)

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

每个答案的答案是@Ayoub Nouri,我将cancelsTouchesInView设置为false,从而解决了该问题。 tapGestureRecognizer?.cancelsTouchesInView = false

答案 13 :(得分:0)

Swift 4.2

在属性检查器中禁用“延迟接地” 解决了该问题。
之后,单击会很平稳,并且didSelectRowAt立即触发。

XCode attributes inspector

答案 14 :(得分:0)

对我有用的是开始键入“ didSelect ...”,然后让自动更正填写其余内容。显然,我语法的一些细节很奇怪。正如其他人所说,请使用IDE!

答案 15 :(得分:0)

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