选中时展开tableviewcell,取消选择时紧凑Swift 3

时间:2017-12-11 12:45:02

标签: ios swift uitableview

所以我有一个类型为ExpyTableView(https://github.com/okhanokbay/ExpyTableView)的mainTableView。一切都很好,我设法实现它并使其工作但是因为它可以在下面的gif中看到我需要为DidSelect和DidDeselect进行额外的+1动作。

demo gif

当我选择要用绿色突出显示并且立即展开其他行时,我想要的东西,并在其后点击它以取消选择并使该行恢复正常。所以通常这只需要在屏幕上点击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

    }
}

我哪里出错了?感谢

2 个答案:

答案 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属性。