我有一个问题与UITableView的didSelectRowAtIndexPath。
我的表已经设置好了,所以当我选择row时,它会初始化一个新的视图控制器并推送它。
当我第一次点击表中的任何一行时,该方法不会被调用。一旦我选择了另一行,它就开始正常工作。
我已经通过在didSelectRowAtIndexPath上设置断点验证了这一点。当添加一个NSLog的方法,我看到,当我选择第二行,最后推动新的视图控制器,我看到两个日志语句出现在控制台同时。
有什么建议吗?
我有一个问题与UITableView的didSelectRowAtIndexPath。
我的表已经设置好了,所以当我选择row时,它会初始化一个新的视图控制器并推送它。
当我第一次点击表中的任何一行时,该方法不会被调用。一旦我选择了另一行,它就开始正常工作。
我已经通过在didSelectRowAtIndexPath上设置断点验证了这一点。当添加一个NSLog的方法,我看到,当我选择第二行,最后推动新的视图控制器,我看到两个日志语句出现在控制台同时。
有什么建议吗?
当前回答
斯威夫特2
确保你把这个设置为true:
self.tableView.allowsSelection = true
把它放在右边的viewDidLoad()之后,super.viewDidLoad()之前
其他回答
斯威夫特3
如果你在一个不是UITableViewController的类中使用Swift 3,并且你正在使用UITableViewDelegate,那么你可能需要使用方法title:
@objc(tableView:didSelectRowAtIndexPath:) func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){...}
这对我来说很有效,尽管我刚刚将我的项目迁移到Swift 3。这是一个相当新的问题,所以稍后可能会修复。
你有没有不小心输入了didDeselectRowAtIndexPath?
如果你在你的类中设置了任何UITapGestureRecognizer,你可以在你的didSelectRowAtIndexPath中添加这一行:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
这对我很管用。
我在我的tableView(swift 4.2)上也有同样的问题,它可以用tableView上的allowmultipleselection属性来修复。
如果allowsMultipleSelection设置为true,表视图的选择机制将改变,通过选择每个单元格tableView didSelectRowAtIndexPath:第一次被调用,通过选择相同的单元格第二次tableView didDeselectRowAtIndexPath:被调用。
这意味着如果一个单元格被点击的次数是奇数(1,3,5,…),那么总是tableView didSelectRowAtIndexPath:将被调用,如果一个单元格被点击的次数是偶数(2,4,6,…),那么总是tableView didDeselectRowAtIndexPath:将被调用。
这使得tableView didSelectRowAtIndexPath:函数在同一单元格的第三个选择时被调用,因此结果是双击调用didSelectRowAtIndexPath:!!
如果你想让tableView didSelectRowAtIndexPath:在每个单元格的选择上被调用那么tableView multiple selection必须设为false, tableView。allowmultipleselection = 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")
}
在我的例子中,我有一个带有手势识别器的UITableView节头。当点击标题时,它应该在该部分中插入几行,并使插入动画化(如展开/折叠部分)。 第一次展开和点击时,didSelectRow委托方法没有被触发。对于进一步的开采和扩展/收缩操作,它的工作情况与预期一致。
根据@Ayoub Nouri的回答,我将cancelsTouchesInView设置为false,这解决了问题。 tapGestureRecognizer ?。cancelsTouchesInView = false