重用动态TableViewCells,而不必在Controller中维护每个单元格的状态

时间:2018-12-11 16:01:42

标签: ios swift uitableview

我有一个UITableView,该UITableView使用的单元格中包含3个可扩展和可折叠的子视图。我希望在UITableViewCell类本身中维护这些视图的状态(状态为collapsedexpanded中)

由于它们是可重用的单元格,因此,当前,如果我在单元格A中展开视图1,然后向下滚动到单元格B,则将展开视图1。我不要这个我希望它崩溃。但是,如果我向上滚动到单元格A,我希望它仍能扩展。

除了将所有这些状态存储在数组或字典中

var expandedViewOneCells: [Int] = []
var expandedViewTwoCells: [Int] = []
etc.

我宁愿让单元本质上独立运行并保持自己的状态...但是当单元被重用时我将如何做呢?请记住,这些单元格中最多只能有3种,因此我可以设置类似only reuse after 3 cells的内容。

明智的做法是保留一个我加载的单元格的数组,然后在cellForRowAt上根据索引从该数组加载该单元格并返回它?

2 个答案:

答案 0 :(得分:0)

在您的func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell函数中,请不要使单元出队,而要创建单元的新实例

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = MyCustomCell()

    return cell
}

如果要从xib文件加载单元,则需要一种从该笔尖创建自定义单元的方法。将以下方法添加到您的CustomCell

static func loadFromNib() -> RequestTableViewCell {
    let nib = UINib(nibName: "\(MyCustomCell.self)", bundle: Bundle.main)
    let cell = nib.instantiate(withOwner: self, options: nil)[0] as! MyCustomCell
    return cell
}

然后在您的func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell中,这将为每一行创建一个新单元格,并且在滚动时不会重复使用该单元格

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = MyCustomCell.loadFromNib()

    return cell
}

如果您的表视图中有很多行,那么这样的解决方案可能不是最佳选择,但是对于 SMALL 的行数量来说,这应该可以

答案 1 :(得分:0)

我看到了两种解决您的问题的方法:

  1. 使用3个View Controller。它们永远都不会被破坏,并在单元格.contentView顶部出现或离开屏幕时在其顶部添加/删除相应的VC视图。在此处查看解决方案http://khanlou.com/2015/04/view-controllers-in-cells/自定义单元格本身只是一个视图,不应该真正关注状态,但是如果将逻辑移到视图控制器中-我们应该没问题,这并不违反MVC 。另外,View Controller可以根据状态跟踪视图的高度,heightForRow(at :)可以要求它

  2. 我将使用堆栈视图,因为这是一个完美的方案。我可能将Cell本身表示为另一个堆栈视图。不确定这些视图到底是什么样子以及如何更改,但是最终可能会像从“堆栈”视图中隐藏/取消隐藏表示“单元格”的第二个视图一样简单。