我正在处理一个tableView,目标是实现可展开/折叠的tableView单元格。单元格的数量是完全动态的。
我已经有了一些东西在运作,但存在一个小问题。我使用didSelectRowAtIndexPath来切换展开/折叠单元格。所以现在发生的是,通过在单元格上的任何位置点击来执行切换。 :-(
在单元格内部,我有两个UIView(Header和Detail)。我需要在点击Header而不是整个单元格时才能切换展开/折叠。
为此,我像这样获取indexPath,但它不起作用,因为indexPathsForSelectedRows返回nil。
我已经有了一些东西在运作,但存在一个小问题。我使用didSelectRowAtIndexPath来切换展开/折叠单元格。所以现在发生的是,通过在单元格上的任何位置点击来执行切换。 :-(
在单元格内部,我有两个UIView(Header和Detail)。我需要在点击Header而不是整个单元格时才能切换展开/折叠。
为此,我像这样获取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: 当前的工作演示
当我在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()
}