Swift-如何从';它绑定到一个xib文件

Swift-如何从';它绑定到一个xib文件,swift,inheritance,cell,xib,nib,Swift,Inheritance,Cell,Xib,Nib,我有一个名为NormalImageCell的自定义单元格,它继承自UITableViewCell并绑定到xib。假设我想创建一个名为LargeImageCell的新单元格,它继承自NormalImageCell,而不创建一个全新的xib。我可以在没有界面生成器的情况下轻松地通过编程实现这一点,但由于NormalImageCell与xib绑定,且xib中的单元格只能连接到一个自定义类和一个reuseIdentifier,我如何才能将其重新用于LargeImageCell 这在没有界面生成器的情况下

我有一个名为NormalImageCell的自定义单元格,它继承自UITableViewCell并绑定到xib。假设我想创建一个名为LargeImageCell的新单元格,它继承自NormalImageCell,而不创建一个全新的xib。我可以在没有界面生成器的情况下轻松地通过编程实现这一点,但由于NormalImageCell与xib绑定,且xib中的单元格只能连接到一个自定义类和一个reuseIdentifier,我如何才能将其重新用于LargeImageCell

这在没有界面生成器的情况下可以工作

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 {
    ...
}

您应该从主捆绑包中检索nib,如下所示:

class func nib() -> UINib {     

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

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

  • 创建对象
    LargeImageCell
    ,但不要给它任何子类型
  • 在初始值设定项中,添加
    NormalImageCell
    作为参数以及任何其他信息
  • 配置
    NormalImageCell
    ,并将其设置为对象上的属性
  • 在数据源中,将
    NormalImageCell
    出列,并用它初始化对象
    LargeImageCell
  • 返回新配置的单元格

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

    如何声明
    nib
    方法?类func nib()->UINib{return UINib(nibName:String(self),bundle:nil)}项目中是否有两个nib文件:NormalImageCell.xib和LargeImageCell.xib?我只有NormalImageCell.xib。我不想为LargeImageCell创建另一个xib,因为这两个单元格几乎相同,只是imageView大小不同。我正试图通过继承NormalImageCell来重用它,这样我就不必复制任何xib/代码。我不想为LargeImageCell创建另一个xib,那么您就不能这样做。