UITableView didSelectRowAtIndexPath:第一次点击时未调用


352

我有一个问题 UITableView's didSelectRowAtIndexPath

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

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

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

有什么建议么?


2
您可以为其发布代码tableView:didSelectRowAtIndexPath:吗?
gerry3

我遇到了同样的问题,请检查我的答案:stackoverflow.com/a/44097559/1600061
Zsivics Sanel

1
主队列中的调度解决了我的问题stackoverflow.com/questions/20149167/…–
durgeshtrivedi

Answers:


1356

您是否偶然输入了De selectRowAtIndexPath吗?


17
@Dschee不会在第一次点击时被调用,因为您没有取消选择任何内容。选择一行后,当您尝试选择第二行时,第一行将被取消选择。
花花公子

19
这就是为什么我如此喜欢。
elbuild

4
我之所以支持这一点,并不是因为我曾经犯过这个错误。我之所以投票,是因为我在过去多年中犯了至少4次此错误,花费了很多时间。
Brooks Hanes 2015年

8
我的天啊!!这可能是我在代码中引入的最严重的错误。
Shantanu Paul

4
哇。节省了我很多时间。
MortalMan 2015年

24

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


2
ha哈哈哈!哇,我花了4个小时试图解决这个问题。@includeMe进行救援(敬礼)!谢谢!

17

我遇到以下问题:

  • 首先在行中点击->没有效果,没有选择,从不
  • 第二次点击并跟随-> 始终正确选择行为

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

在此处输入图片说明

希望可以帮助某人


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

12

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


我都有 手势识别器和didSelectRowAtIndexPath吗?但是,手势识别器始终优先。无法到达第二个。有没有办法处理这两种情况,还是我必须摆脱手势识别器?谢谢!
罗恩

这一定是最重要的:)在iOS开发7年后,我花了1个小时。
小丑

6

我辩论甚至发布了这个答案,因为我认为恒星会对齐以使其表现出来。

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


您是否找到发生这种情况的原因?我有完全一样的问题。当我关闭表格弹跳时,表格中的第一行/最后一行在第一次点击时就没有反应。我以为是bug,但是已经有一年多了,而且还在发生。
filip.karas 2015年

不。我只是打开了表格视图弹跳,然后将其留在了那里。
Chase Roberts

我仅在iPhone 5(iOS 10.3)上遇到此问题-在我的表格视图上打开弹跳修复了它。很奇怪!
Lee Probert

4

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

我最后打电话了

[tableView deselectRowAtIndexPath:indexPath animated:NO];

第一件事

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

这是不一样的,但已经足够了。让我想知道ios10会带来哪种表损坏。


这对我有用,但是我需要一种解决方法来隐藏选择内容而不使其样式为None。我确实进行了覆盖,setSelected但是当用户握住该单元时,出现的选择是不可接受的
MMujtabaRoohani

1

SWIFT 2

确保您将此设置为true:

self.tableView.allowsSelection = true

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


1

SWIFT 3

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

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

尽管我刚刚将项目迁移到Swift 3,但它对我还是有用的。


1

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

[tableView deselectRowAtIndexPath:indexPath animated:NO];

这对我有用。


1

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



0

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


0

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

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


0

斯威夫特4.2

在属性检查器中禁用“延迟下放”可以解决此问题。
此后,单击变得平滑,并且didSelectRowAt立即触发。

XCode属性检查器


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.