我遇到UITableView's
didSelectRowAtIndexPath
的问题。
我的表已设置好,当我选择行时,它会初始化一个新的视图控制器并将其推送。
第一次点击表格中的任何一行时,该方法不会被调用。一旦我选择了另一行,它就会开始正常工作。
我已通过在didSelectRowAtIndexPath
上设置断点来验证这一点。向方法添加NSLog
时,我看到当我选择最后推送新视图控制器的第二行时,我看到控制台同时出现两个日志语句。
有什么建议吗?
答案 0 :(得分:1330)
您偶然输入的几率 De selectRowAtIndexPath?
答案 1 :(得分:24)
还要检查xib文件中表视图的selection属性。根据需要使用“单一选择”或“多选”。
答案 2 :(得分:17)
我遇到了以下问题:
就我而言,我的错误是在Interface Builder中检查Show Selection on Touch
。您可以在IB中取消选中它:
希望能帮到某人
答案 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)
答案 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多个选择设置为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")
}