Swift - 如何从绑定到xib文件的自定义单元格继承

时间:2016-07-31 09:49:42

标签: swift inheritance cell xib nib

我有一个名为 NormalImageCell 的自定义单元,它继承自 UITableViewCell 并绑定到xib。假设我想创建一个名为 LargeImageCell 的新单元,它继承自 NormalImageCell 而不创建一个全新的xib。我可以在没有界面构建器的情况下以编程方式轻松完成此操作,但由于 NormalImageCell 绑定到xib并且xib中的单元格只能连接到一个自定义类和一个reuseIdentifier,我怎么能够将它重用于LargeImageCell?

没有Interface Builder就可以使用。

class LargeImageCell: NormalImageCell {...}

tableView.registerClass(NormalImageCell.self, forCellWithReuseIdentifier: NormalImageCell.id())
tableView.registerClass(LargeImageCell.self, forCellWithReuseIdentifier: LargeImageCell.id())

这与Interface Builder崩溃了:

tableView.registerNib(NormalImageCell.nib(), forCellWithReuseIdentifier: NormalImageCell.id())
tableView.registerNib(LargeImageCell.nib(), forCellWithReuseIdentifier: LargeImageCell.id())

顺便说一下,我正在声明这样的nib和id方法:

class NormalImageCell: UITableViewCell {

    class func id() -> String {
        return String(self)
    }

    class func nib() -> UINib { 
        return UINib(nibName: String(self), bundle: nil) 
    }
}

class LargeImageCell: NormalmageCell {
    ...
}

2 个答案:

答案 0 :(得分:0)

你应该从主包中检索nib,如:

class func nib() -> UINib {     

   return UINib(nibName: String(self), bundle: NSBundle.mainBundle())
}

答案 1 :(得分:0)

所以有一个解决方案,但它确实使您的数据源变得有点复杂。

  1. 创建您的对象 LargeImageCell,但不要为其指定任何子类型。
  2. 在初始化程序中添加 NormalImageCell 作为参数以及任何其他信息。
  3. 配置 NormalImageCell 并将其设置为您的对象的属性。
  4. 在您的数据源中,将 NormalImageCell 出列并用它初始化您的对象 LargeImageCell
  5. 返回新配置的单元格。

不是最好的选择,但它适用于笔尖单元上的扩展功能。