所以我有一个类型为ExpyTableView(https://github.com/okhanokbay/ExpyTableView)的mainTableView。一切都很好,我设法实现它并使其工作但是因为它可以在下面的gif中看到我需要为DidSelect和DidDeselect进行额外的+1动作。
当我选择要用绿色突出显示并且立即展开其他行时,我想要的东西,并在其后点击它以取消选择并使该行恢复正常。所以通常这只需要在屏幕上点击2次后才会发生......相反,我会在gif中看到4。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//MARK : Print
print("Selected Section \(indexPath.section), Row : \(indexPath.row)")
///////////////
if let cell = tableView.cellForRow(at: indexPath) {
if (indexPath.section == 1) || (indexPath.section == 2) || (indexPath.section == 3) {
cell.layer.borderWidth = 2.0
cell.layer.borderColor = Theme.defaultColor().cgColor
cell.layer.shadowOffset = CGSize.init(width: 0.5, height: 0.5)
}
}
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) {
tableView.deselectRow(at: indexPath, animated: false)
cell.layer.borderWidth = 0.1
cell.layer.borderColor = UIColor.lightGray.cgColor
}
}
我哪里出错了?感谢
答案 0 :(得分:0)
基本上你会收听didDeselectRow
的表格更改,这意味着:
取消选择表视图单元后,将执行代码。所以你可以忘记那些代码,除非你真的需要它。但是,您所做的是 selects
该行两次。一旦扩张,其次是崩溃。
您需要做的是记住所选单元格的索引,然后在ID didSelectRowAt
时取消选择它
因此,声明属性fileprivate var currentlySelectedCellIndexPath: IndexPath?
,然后在didSelectRowAt
中使用以下内容。
var currentlySelectedCellIndexPath: IndexPath?
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let currentlySelectedCellIndexPath = currentlySelectedCellIndexPath {
// unselect the selected one
makeCellUnSelected(in: tableView, on: currentlySelectedCellIndexPath)
guard currentlySelectedCellIndexPath != indexPath else {
tableView.deselectRow(at: currentlySelectedCellIndexPath , animated: true)
self.currentlySelectedCellIndexPath = nil
return
}
}
// Highlight the proper cell
makeCellSelected(in: tableView, on: indexPath)
currentlySelectedCellIndexPath = indexPath
}
func makeCellSelected(in tableView: UITableView, on indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) {
if (indexPath.section == 1) || (indexPath.section == 2) || (indexPath.section == 3) {
cell.layer.borderWidth = 2.0
cell.layer.borderColor = Theme.defaultColor().cgColor
cell.layer.shadowOffset = CGSize.init(width: 0.5, height: 0.5)
}
}
}
func makeCellUnSelected(in tableView: UITableView, on indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) {
cell.layer.borderWidth = 0.1
cell.layer.borderColor = UIColor.lightGray.cgColor
}
}
解释它的作用: 功能makeCellselected& makeCellUnselected只是应用样式更改来突出显示/取消突出显示单元格,就像之前一样。
函数func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
中的只检查当前可见和选定的单元格。如果它是同一个单元格,则将其折叠并保护并返回,因为您只需要展开/折叠。如果它不是同一个单元格,则只需通过调用makeCellUnselected
并选择新的单元格来放弃选择。这应该解决你的问题到目前为止。如果您有任何其他问题,请告诉我。
答案 1 :(得分:0)
我要做的是在模型isExpanded
中有一个属性,如果需要扩展单元格,它将存储。这样您就可以在heightForRowAtIndexPath
中使用它来获取项目并阅读isExpanded
属性。