繁体   English   中英

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

[英](Swift) Expand and Collapse tableview cell when tapped

早上好

我创建了一个自定义的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
    }



}

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

您可以在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
}

(未经测试而写)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM