我正在使用tableView,目标是实现可扩展/可折叠的tableView单元格。单元格的数量是完全动态的。
我的工作正常,但是有一个小问题。我正在使用didSelectRowAtIndexPath来切换展开/折叠单元格。因此,现在发生的事情是通过在单元格的任意位置点击来执行切换。 :-(
在单元格内部,我有两个UIView(分别为Header和Detail)。我需要切换展开/折叠才能仅在点击“页眉”而不是整个单元格时起作用。
为此,我要像这里那样获取indexPath,但由于indexPathsForSelectedRows返回nil,因此无法正常工作。
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return myVouchers.count
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if selectedIndex == indexPath.row {
return 150.0
}
else {
return 40.0
}
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
cell = tableView.dequeueReusableCellWithIdentifier("CollapsedCell", forIndexPath: indexPath) as! CollapsedCell
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action:#selector(VoucherDetailViewController.expandCell(_:)))
(cell as! CollapsedCell).headerView.addGestureRecognizer(tapGestureRecognizer)
return cell
}
func getIndexPathForSelectedCell() -> NSIndexPath? {
var indexPath: NSIndexPath?
if tableView.indexPathsForSelectedRows?.count > 0 { //**nil is returned here**
indexPath = (tableView.indexPathsForSelectedRows?[0])! as NSIndexPath
}
return indexPath
}
func expandCell(sender: UITapGestureRecognizer) {
if let myIndexPath = getIndexPathForSelectedCell() {
if selectedIndex == myIndexPath.row {
selectedIndex = -1
}
else {
selectedIndex = myIndexPath.row
}
self.tableView.beginUpdates()
self.tableView.reloadRowsAtIndexPaths([myIndexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
self.tableView.endUpdates()
}
}
有人可以给我一个线索,为什么indexPathsForSelectedRows返回nil吗?
非常感谢!
更新1:
Current Working demo
当我在didSelectRowAtIndexPath中添加扩展单元格逻辑并删除单元格内 View 的tapGestureRecognizer时,它看起来像这样-
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if selectedIndex == indexPath.row {
selectedIndex = -1
}
else {
selectedIndex = indexPath.row
}
self.tableView.beginUpdates()
self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
self.tableView.endUpdates()
}
最佳答案
您收到此错误是因为
self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
重新加载并取消选择您的行。
您只需选择行,然后重新加载行(此操作将取消选择该行),然后您想使用
tableView.indexPathsForSelectedRows
但是表格 View 目前没有任何选定的行。
作为解决方案,您可以将选定的indexPath存储在新变量中,并使用此变量代替
tableView.indexPathsForSelectedRows
关于ios - Swift indexPathsForSelectedRows返回nil,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44410616/