微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何创建不可重用的 UITableViewCell

如何解决如何创建不可重用的 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,请使用属性检查器将内容类型从动态变为静态。所以你可以将单元格的数量固定为特定的数字(在下面的第一张和第二张图片中提到)。

enter image description here

enter image description here

,

不确定这是否能回答您的问题,但您可以尝试在 CustomTableViewCell() 中调用 override func prepareForReuse()。 例如,如果您想在表格视图中添加一个开关,以避免可重复使用的单元格将您列表中的所有开关弄乱,您可以这样做:

override func prepareForReuse() {
    super.prepareForReuse()
    // declare the switch with the default state
    mySwitch.isOn = false
 
}
,

稍微澄清一下......

仅仅因为您使用可重用单元并不意味着您必须对其进行任何“动态”处理。

假设您在 Storyboard 中设计单元格,您可能会遇到以下情况:

enter image description here

我设计了 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])"

它加载(出队)正确的“静态”单元格,然后我得到这个输出:

enter image description here

如果我将数据源数组更改为:

theData = [1,4]

我明白了:

enter image description here

使用 theData = [5,4]

enter image description here

并使用 theData = [4,5,1,2]

enter image description here

如您所见,单元格是“静态的”,但我只能按照我想要的顺序显示我想要的单元格。

如果您在 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 举报,一经查实,本站将立刻删除。