(Swift)点击时展开和折叠tableview单元格

时间:2016-11-17 19:48:34

标签: ios swift uitableview swift3

早上好

我创建了一个自定义的TableViewCell,它内部有一个CollectionViewCell和一个方向箭头。我能够让细胞膨胀和折叠但是当我扩展一个细胞时我想要它,然后我点击另一个细胞以前的崩溃。示例:如果单元格被展开并且单元格被轻敲,我希望单元格收缩,单元格同时展开。因此,在任何给定时刻,只有一个单元格可以处于展开状态,从而更改目标箭头。

示例:

如果cellA被扩展并且tapB被轻击,我希望cellA收缩并且cellB同时扩展。因此,在任何给定时刻,只有一个细胞可以处于扩张状态,从而改变目标箭头。

我的代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {






    switch(selectedIndexPath)
    {

    case nil:

        let cell = myTableView.cellForRow(at: indexPath) as! TableViewCell
        cell.arrowImagem.image = UIImage(named:"content_arrow2")
        selectedIndexPath = indexPath



    default:
        if selectedIndexPath! == indexPath
        {

            let cell = myTableView.cellForRow(at: indexPath) as! TableViewCell
            cell.arrowImagem.image = UIImage(named:"content_arrow")
            //cell.reloadInputViews()
            selectedIndexPath = nil

        }


    }

    self.myTableView.beginUpdates()

    self.myTableView.reloadData()


    //myTableView.reloadRows(at: [indexPath], with: .automatic)

    self.myTableView.endUpdates()

}


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {





    let index = indexPath

    if selectedIndexPath != nil{
        if(index == selectedIndexPath)
        {
            return 147
        }
        else{
            return 67
        }
    }
    else
    {
        return 67
    }



}

2 个答案:

答案 0 :(得分:0)

你可以这样做,但你需要做一些编码。首先检测何时选择一行(保持变量中所选行的索引路径)。当选择一行时,您将添加新选定行的索引路径以及之前选择的索引路径(您在变量中的那个)在从didSelectRowAt内部传递给tableView reloadRows的数组中,此函数将强制重绘将调用两行和heightForRowAt函数来获取两行的高度,在heightForRow中,您将检查当前选定的行(您还记得我前面提到的变量吗?)并返回其扩展高度,而其他行则为你返回折叠高度。你应该得到你想要的结果。希望这会有所帮助。

答案 1 :(得分:0)

您可以在didSet处理程序中实现大部分功能:

var selectedIndexPath: IndexPath? {
    didSet {
        guard indexPath != oldValue else {
           return
        }

        if let oldValue = oldValue {
            let cell = myTableView.cellForRow(at: indexPath) as? TableViewCell
            cell?.arrowImagem.image = UIImage(named:"content_arrow")
        }

        if let indexPath = indexPath {
            let cell = myTableView.cellForRow(at: indexPath) as? TableViewCell
            cell?.arrowImagem.image = UIImage(named:"content_arrow2")
        }

        let rowsToUpdate = [indexPath, oldValue].compactMap { $0 }

        self.myTableView.beginUpdates()

        // I don't think you actually need to reload rows here but keeping your code here...
        self.myTableView.reloadRows(at: rowsToUpdate, with: .automatic)
        self.myTableView.endUpdates()
    }
}

然后在didSelect

if indexPath == selectedIndexPath {
   selectedIndexPath = nil
} else {
   selectedIndexPath = indexPath
}

(未经测试而写)