如何解决如何创建不可重用的 UITableViewCell
编辑:似乎我对“小/固定数量的单元格”的含义并不完全清楚。我的意思是单元格的数量是不变的(总是只有 10 个单元格)。 然而,单元格的内容是非常动态的。我有一个复杂的 UITableViewCell 类来处理这个问题,我很难在给定时间“捕获”每个元素和变量的确切状态,以便“重用”正常工作。
我知道它很不受欢迎...但我想创建不可重用的 UITableViewCells。我决定这样做的原因是因为我只需要少量/固定数量的单元格(准确地说是 10 个),而且它们非常复杂,所以我觉得必须在重用之前捕获它们的各种状态,然后重新设置显示每个单元格时的这些状态会非常乏味,特别是因为内存似乎不是只有十个不可重用单元格的问题。
但是,我很困惑如何做到这一点(关于实现这一非正统任务的在线资源非常有限)。作为一个简化的测试,我尝试在 cellForRowAt
数据源方法中简单地创建我的 CustomTableViewCell 的一个实例,但该单元格显示为完全空白。在显示单元格之前似乎没有建立任何 IBOutlets(我在单元格的 print()
方法中发布了一个 awakeFromNib()
语句,但从未调用过)。
有谁知道我遗漏了哪些步骤和/或做错了什么?
作为参考,这是我的表视图数据源的 cellForRowAt
方法:
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Assuming for the sake of the argument that there is only one row (so only one cell needed)...
let cell = CustomTableViewCell()
return cell
}
我也尝试过使用 let cell = CustomTableViewCell(style: .default,reuseIdentifier: "customCell")
创建单元格,但这也不起作用。
任何帮助将不胜感激--谢谢!
解决方法
为了使您的单元格静态化,一旦您必须创建 tableViewController,请使用属性检查器将内容类型从动态变为静态。所以你可以将单元格的数量固定为特定的数字(在下面的第一张和第二张图片中提到)。
,不确定这是否能回答您的问题,但您可以尝试在 CustomTableViewCell() 中调用 override func prepareForReuse()。 例如,如果您想在表格视图中添加一个开关,以避免可重复使用的单元格将您列表中的所有开关弄乱,您可以这样做:
override func prepareForReuse() {
super.prepareForReuse()
// declare the switch with the default state
mySwitch.isOn = false
}
,
稍微澄清一下......
仅仅因为您使用可重用单元并不意味着您必须对其进行任何“动态”处理。
假设您在 Storyboard 中设计单元格,您可能会遇到以下情况:
我设计了 5 个“复杂的静态”单元。它们看起来正是我希望它们显示的方式,因此没有自定义单元格类或 @IBOutlet
连接。
我所做的只是给每个人一个不同的 identifier
...在这种情况下,我使用了“type1”/“type2”/“type3”/“type4”/“type5”。>
现在,一个简单的控制器类:
class RowTypesTableViewController: UITableViewController {
var theData: [Int] = []
override func viewDidLoad() {
super.viewDidLoad()
theData = [1,2,3,4,5]
}
override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
return theData.count
}
override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let id: String = "type\(theData[indexPath.row])"
let cell = tableView.dequeueReusableCell(withIdentifier: id,for: indexPath)
return cell
}
}
请注意,在 cellForRowAt
中,我使用数据源值来生成重用标识符:
let id: String = "type\(theData[indexPath.row])"
它加载(出队)正确的“静态”单元格,然后我得到这个输出:
如果我将数据源数组更改为:
theData = [1,4]
我明白了:
使用 theData = [5,4]
:
并使用 theData = [4,5,1,2]
:
如您所见,单元格是“静态的”,但我只能按照我想要的顺序显示我想要的单元格。
如果您在 xib
文件中设计单元格,请将其添加到 viewDidLoad()
:
tableView.register(UINib(nibName: "type1",bundle: nil),forCellReuseIdentifier: "type1")
tableView.register(UINib(nibName: "type2",forCellReuseIdentifier: "type2")
tableView.register(UINib(nibName: "type3",forCellReuseIdentifier: "type3")
tableView.register(UINib(nibName: "type4",forCellReuseIdentifier: "type4")
tableView.register(UINib(nibName: "type5",forCellReuseIdentifier: "type5")
显然,用对您的代码有意义的字符串替换“类型”字符串。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。