gpt4 book ai didi

ios - 将多个自定义 UITableViewCell 链接到单个 xib

转载 作者:行者123 更新时间:2023-11-28 13:53:09 25 4
gpt4 key购买 nike

问题

我正在创建一个可重用的自定义 UITableViewCell,然后将其子类化以供重用。如何将这些不同的子类设置为链接到同一个 xib 文件?

背景

让我们调用我的自定义 UITableViewCell PickerTableViewCell。这个单元格包含一个 UIPickerView,以及关于选择器 View 的外观和行为的所有实现。当我想使用这个单元格时,我唯一需要给它的是选择器 View 的数据。所以我将 PickerTableViewCell 子类化,然后简单地创建我需要的数据源并将其分配给选择器 View 。到目前为止,这一切都运作良好。

下面是PickerTableViewCell的相关部分:

class PickerTableViewCell: UITableViewCell {

var picker: UIPickerView! = UIPickerView()
var pickerDataSource: PickerViewDataSource!

override func awakeFromNib() {
super.awakeFromNib()

self.picker = UIPickerView(frame: CGRect(x: 0, y: 40, width: 0, height: 0))
self.picker.delegate = self

self.assignPickerDataSource()
}

// Must be overriden by child classes

func assignPickerDataSource() {
fatalError("Must Override")
}

这是一个子类的例子:

class LocationPickerTableViewCell: PickerTableViewCell {

override func assignPickerDataSource() {
self.pickerDataSource = LocationPickerDataSource()
self.picker.dataSource = self.pickerDataSource
}
}

问题

由于我在各处使用这些单元格,使用不同的数据源,我创建了一个 xib 文件,它定义了单元格的外观,名为 PickerTableViewCell.xib,并将其分配给类 PickerTableViewCell。在我想使用它的 View Controller 中,我将单元格注册到 viewDidLoad() 中的 TableView 。然后,在 func tableView(_:, cellForRowAt) 中,我将我想要的子类出队,如下所示:

let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier") as! LocationPickerTableViewCell
return cell

这就是问题所在。创建的单元格是 PickerTableViewCell,而不是其子类 LocationPickerTableViewCell。这遇到了我放在父类中的 fatal error ,该错误被子类覆盖。

我发现解决这个问题的唯一方法是为我要创建的每个子类创建一个单独的 xib 文件,并将其分配给相关的子类。虽然此解决方案确实有效,但在我的项目中拥有所有这些几乎相同的 xib 文件(除了它们被分配到的类之外)感觉不对。

有没有办法解决这个问题,让所有这些单元格都链接到同一个 xib 文件?

谢谢! :)

最佳答案

将 xib 加载的 View 添加到要使用它的 UITableViewCell 类中。

  1. 根据您的要求设计创建您的 xib,在您的示例中 PickerTableViewCell.xib

  2. 创建要在其中使用该 View 的 UITableViewCell 子类。为此,我正在使用 FirstTableViewCellSecondTableViewCell

在表格单元格的构造函数中加载 xib 并将其添加到表格单元格。

let nib = Bundle.main.loadNibNamed("PickerTableViewCell", owner: nil, options: nil)
if let view = nib?.first as? UIView{
self.addSubview(view)
}

如果 xib 有任何 @IBOutlet 然后通过 viewWithTag 函数获取它们并分配给类变量

if let label = self.viewWithTag(1) as? UILabel{
self.label = label
}

override reuseIdentifier 不同名称的每个 tableviewCell 子类的 var

override var reuseIdentifier: String?{
return "FirstTableViewCell"
}

现在你可以在你想要的地方使用这些类,按照以下步骤使用:

用带有 tableview 的 xib 注册这个 tableviewCell 子类:

tableView.register(FirstTableViewCell.self, forCellReuseIdentifier:"PickerTableViewCell")

现在在 cellForRowAt indexPath 方法中使用它。

var cell = tableView.dequeueReusableCell(withIdentifier: "FirstTableViewCell", for: indexPath) as? FirstTableViewCell
if cell == nil {
cell = FirstTableViewCell()
}
cell?.label?.text = "FirstTableViewCell"

关于ios - 将多个自定义 UITableViewCell 链接到单个 xib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54300381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com