【问题标题】:UITableView didSelectRowAtIndexPath: not being called on first tapUITableView didSelectRowAtIndexPath:第一次点击时没有被调用
【发布时间】:2011-01-07 13:21:37
【问题描述】:

我遇到了UITableView's didSelectRowAtIndexPath 的问题。

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

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

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

有什么建议吗?

【问题讨论】:

标签: uitableview cocoa-touch uikit didselectrowatindexpath


【解决方案1】:

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

【讨论】:

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

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

【讨论】:

  • 呸哈哈哈!哇,我花了 4 个小时试图弄清楚这一点。 @includeMe 来救援(敬礼)!谢谢!
【解决方案3】:

我遇到了以下问题:

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

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

希望对某人有所帮助

【讨论】:

  • 你是我的英雄!知道为什么这是默认设置吗?我想不出任何应用程序有这种行为,我认为这是一个非常奇怪的默认值。
【解决方案4】:

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

【讨论】:

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

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

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

【讨论】:

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

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

我打完电话

[tableView deselectRowAtIndexPath:indexPath animated:NO];

第一件事

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

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

【讨论】:

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

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

【讨论】:

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

SWIFT 2

确保您已将此设置为 true:

self.tableView.allowsSelection = true

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

【讨论】:

    【解决方案9】:

    SWIFT 3

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

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

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

    【讨论】:

      【解决方案10】:

      SWIFT 3

      其他答案都不适用于我的情况,为我解决的问题是:

      tableView.delaysContentTouches = false

      【讨论】:

        【解决方案11】:

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

        [tableView deselectRowAtIndexPath:indexPath animated:NO];
        

        这对我有用。

        【讨论】:

          【解决方案12】:

          斯威夫特 4.2

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

          【讨论】:

            【解决方案13】:

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

            【讨论】:

              【解决方案14】:

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

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

              【讨论】:

                【解决方案15】:

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

                【讨论】:

                  【解决方案16】:

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

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

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

                  这使得tableView didSelectRowAtIndexPath:函数在同一个单元格的第三个选择中被调用,所以结果是双击调用didSelectRowAtIndexPath:!!!

                  如果您希望在每个单元格的选择上调用tableView didSelectRowAtIndexPath:,则必须将 tableView 多选设置为false、tableView.allowsMultipleSelection = false。

                  通过这样做,每次点击单元格时,tableView didSelectRowAtIndexPath: 都会在表格视图中被调用,通过选择另一个单元格 tableView didDeselectRowAtIndexPath: 将被调用,因为 之前选择了单元格,然后是 @ 新选择的单元格将调用 987654335@。

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

                  【讨论】:

                    猜你喜欢
                    • 2015-01-20
                    • 2012-02-24
                    • 2015-03-10
                    • 2023-04-01
                    • 2015-02-22
                    • 2015-05-17
                    • 2012-09-18
                    • 2011-03-04
                    相关资源
                    最近更新 更多