UITableView's
didSelectRowAtIndexPath
有问题。
我的表已设置,因此当我选择行时,它会初始化一个新的视图控制器并推送它。
我第一次点击表格中的任何行时,都不会调用该方法。一旦我选择了另一行,它就会开始正常工作。
我已通过在 didSelectRowAtIndexPath
上设置断点来验证这一点。在方法中添加 NSLog
时,我看到当我选择最终推送新视图控制器的第二行时,我看到两个日志语句同时出现在控制台中。
有什么建议么?
tableView:didSelectRowAtIndexPath:
的代码吗?
您是否有可能不小心输入了 didDeselectRowAtIndexPath?
还要检查 xib 文件中表视图的选择属性。根据需要使用“单选”或“多选”。
我遇到了以下问题:
第一次点击行 -> 没有效果,没有选择,从不
第二次点击并关注 -> 正确的选择行为,总是
就我而言,我的错误是在 Interface Builder 中检查 Show Selection on Touch
。您可以在此处在 IB 中取消选中它:
https://i.stack.imgur.com/WX3bQ.png
希望对某人有所帮助
检查您是否在班级中设置了任何手势识别器。删除手势对我有用。
我什至争论过发布这个答案,因为我认为星星有点对齐,以便表现出来。
我遇到了这个问题的变体,并检查了其他解决方案。在我的表格视图中,它没有在第一次点击时处理我表格的最后一行。它突出显示它,但没有调用 didSelectRowAtIndexPath
。所有其他行工作正常。但是,如果我打开 tableview 弹跳,那么它似乎可以解决问题(但是你必须处理 tableview 弹跳)。
UITableViewCellSelectionStyleNone 设置为显示该问题的单元格(ios9)。
我终于打电话了
[tableView deselectRowAtIndexPath:indexPath animated:NO];
第一件事
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
这是不一样的,但已经足够好了。让我想知道ios10会带来什么样的桌面破损。
setSelected
,但是当用户拿着单元格时,出现的选择是不可接受的
当您在 tableView 中使用手势识别器时也会发生此问题,在这种情况下您不需要删除它们,您只需要确保您的手势属性 cancelsTouchesInView = false
这是一个布尔值,影响是否将触摸传递到识别手势时的视图。
斯威夫特 2
确保您将此设置为 true:
self.tableView.allowsSelection = true
将其放在您的右侧上方 viewDidLoad()
和 super.viewDidLoad()
之前
斯威夫特 3
如果您在一个不是 UITableViewController
的类中使用 Swift 3 并且您正在使用 UITableViewDelegate
,那么您可能需要使用方法标题:
@objc(tableView:didSelectRowAtIndexPath:) func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){...}
这对我有用,虽然我刚刚将我的项目迁移到 Swift 3。它是相当新的,所以这可能会在以后修复。
斯威夫特 3
在我的情况下,其他答案都不起作用,对我来说解决的是:
tableView.delaysContentTouches = false
如果你在你的类中设置了任何 UITapGestureRecognizer,你可以在你的 didSelectRowAtIndexPath 中添加这一行:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
这对我有用。
斯威夫特 4.2
在属性检查器中禁用“延迟着陆”解决了这个问题。之后点击很流畅,didSelectRowAt 立即触发。
https://i.stack.imgur.com/AGnGH.png
在第一次或第二次点击时,我的应用程序中没有调用 didSelectRowAt
函数...我试图解决问题但找不到任何解决方案。但突然我意识到,我正在使用 view.animation 颜色更改... Delegate
方法在动画持续时没有被调用
就我而言,我有一个带有手势识别器的 UITableView 部分标题。当标题被点击时,它应该在该部分中插入几行并为插入设置动画(如展开/折叠部分)。第一次展开和点击时,没有触发 didSelectRow 委托方法。对于进一步的点击和展开/折叠操作,它按预期工作。
根据 @Ayoub Nouri 的回答,我将 cancelsTouchesInView 设置为 false,这解决了问题。 tapGestureRecognizer?.cancelsTouchesInView = false
对我有用的是开始输入“didSelect ...”,然后让自动更正填写其余部分。显然我的语法的一些细节是不稳定的。正如其他人所说,使用IDE!
我在我的 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 多选设置为 false
、tableView.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")
}
不定期副业成功案例分享