Loh*_*olu 5 uitableview ios swift
我正在使用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()
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以给我一个提示为什么indexPathsForSelectedRows返回nil吗?
非常感谢!
更新1: 当前工作演示
当我在didSelectRowAtIndexPath中添加扩展单元格逻辑并删除单元格内视图的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()
}
Run Code Online (Sandbox Code Playgroud)
你遇到这个错误是因为
self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
Run Code Online (Sandbox Code Playgroud)
重新加载并取消选择您的行。
您只需选择行,然后重新加载行(此操作将取消选择该行),稍后您想使用以下方式获取选定的行
tableView.indexPathsForSelectedRows
Run Code Online (Sandbox Code Playgroud)
但表视图此时没有任何选定的行。
作为解决方案,您可以将选定的 indexPath 存储在新变量中,并使用此变量而不是
tableView.indexPathsForSelectedRows
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2040 次 |
| 最近记录: |