我有一个UITableView,该UITableView使用的单元格中包含3个可扩展和可折叠的子视图。我希望在UITableViewCell类本身中维护这些视图的状态(状态为collapsed
或expanded
中)
由于它们是可重用的单元格,因此,当前,如果我在单元格A中展开视图1,然后向下滚动到单元格B,则将展开视图1。我不要这个我希望它崩溃。但是,如果我向上滚动到单元格A,我希望它仍能扩展。
除了将所有这些状态存储在数组或字典中
var expandedViewOneCells: [Int] = []
var expandedViewTwoCells: [Int] = []
etc.
我宁愿让单元本质上独立运行并保持自己的状态...但是当单元被重用时我将如何做呢?请记住,这些单元格中最多只能有3种,因此我可以设置类似only reuse after 3 cells
的内容。
明智的做法是保留一个我加载的单元格的数组,然后在cellForRowAt
上根据索引从该数组加载该单元格并返回它?
答案 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)
我看到了两种解决您的问题的方法:
使用3个View Controller。它们永远都不会被破坏,并在单元格.contentView
顶部出现或离开屏幕时在其顶部添加/删除相应的VC视图。在此处查看解决方案http://khanlou.com/2015/04/view-controllers-in-cells/自定义单元格本身只是一个视图,不应该真正关注状态,但是如果将逻辑移到视图控制器中-我们应该没问题,这并不违反MVC 。另外,View Controller可以根据状态跟踪视图的高度,heightForRow(at :)可以要求它
我将使用堆栈视图,因为这是一个完美的方案。我可能将Cell本身表示为另一个堆栈视图。不确定这些视图到底是什么样子以及如何更改,但是最终可能会像从“堆栈”视图中隐藏/取消隐藏表示“单元格”的第二个视图一样简单。