Ios 为不同的UITableViewCell类创建single.xib
我面临一个问题 我有一个Ios 为不同的UITableViewCell类创建single.xib,ios,swift,uitableview,xib,Ios,Swift,Uitableview,Xib,我面临一个问题 我有一个NNVerticalStackTableViewCell.xib文件及其相应的NNVerticalStackTableViewCell.swift文件 NNVerticalStackTableViewCell.swift文件的代码 class NNVerticalStackTableViewCell: UITableViewCell { //MARK: Outlets @IBOutlet weak var titleLabel: UILabel!
NNVerticalStackTableViewCell.xib
文件及其相应的NNVerticalStackTableViewCell.swift
文件
NNVerticalStackTableViewCell.swift文件的代码
class NNVerticalStackTableViewCell: UITableViewCell
{
//MARK: Outlets
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var verticalStack: NNVerticalStackView!
//MARK: Internal Properties
var titleString : String?
{
set{
self.titleLabel.text = newValue
}
get{
return self.titleLabel.text
}
}
//MARK: View Lifecycle Methods
override func awakeFromNib()
{
super.awakeFromNib()
self.titleLabel.text = nil
}
//MARK: Internal Methods
func addViewsInVerticalStack(viewsArray : [UIView])
{
for view in viewsArray
{
self.verticalStack.insertStackItem(view)
}
}
}
NNVerticalStackTableViewCell.xib文件的接口
class NNVerticalStackTableViewCell: UITableViewCell
{
//MARK: Outlets
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var verticalStack: NNVerticalStackView!
//MARK: Internal Properties
var titleString : String?
{
set{
self.titleLabel.text = newValue
}
get{
return self.titleLabel.text
}
}
//MARK: View Lifecycle Methods
override func awakeFromNib()
{
super.awakeFromNib()
self.titleLabel.text = nil
}
//MARK: Internal Methods
func addViewsInVerticalStack(viewsArray : [UIView])
{
for view in viewsArray
{
self.verticalStack.insertStackItem(view)
}
}
}
使用类名
作为:NNVerticalStackTableViewCell
和单元格标识符
作为:NNVerticalStackTableViewCell
现在,我创建了NNVerticalStackTableViewCell
的子类,如下所示:
class NNPropertiesUnderProjectTableViewCell: NNVerticalStackTableViewCell
{
//MARK: Internal Properties
var completionHandler : ((NNSearchPreference) -> Void)?
//MARK: Internal Methods
func configureCell(_ propertiesUnderProjectArray : [[String : Any]])
{
var viewsArray = [UIView]()
for dict in propertiesUnderProjectArray
{
let elementView = NNPropertiesUnderProjectElementView.loadFromNib()
elementView?.configureViewWith(buttonTitleString: dict["displayString"] as! String, searchPreference: dict["searchPreference"] as! NNSearchPreference, completionHandler: {[weak self] (searchPreference) in
if let handler = self?.completionHandler
{
handler(searchPreference)
}
})
viewsArray.addObject(elementView)
}
self.addViewsInVerticalStack(viewsArray: viewsArray)
}
}
现在,我要做的是将nnpropertiesUnprojectTableViewCell
类与NNVerticalStackTableViewCell.xib
接口一起使用
类似于NNPropertiesUnderProjectTableViewCell
class I有许多其他类使用与NNVerticalStackTableViewCell.xib相同的接口,并相应地对其进行自定义
在我的ViewController
中,我注册了NNVerticalStackTableViewCell.xib
,然后将单元格创建为:
self.tableView.register(UINib(nibName: "NNVerticalStackTableViewCell"), forCellReuseIdentifier: "NNVerticalStackTableViewCell")
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let propertiesUnderProjectCell = tableView.dequeueReusableCell(withIdentifier: "NNVerticalStackTableViewCell", for: indexPath as IndexPath) as! NNPropertiesUnderProjectTableViewCell
}
但是,我得到了一个例外:
Could not cast value of type 'NNVerticalStackTableViewCell' (0x100945878) to 'NNPropertiesUnderProjectTableViewCell' (0x100949330).
谁能提出解决这个问题的建议吗。我想使用single.xib,不想重复代码。您可以,但是,不要使用UITableViewCell
,而是使用类似的UIView
为单元格内容视图创建一个xib,并为其指定一个类(如CellView
)。
在每个单元格类中,使用loadNibNamed
获取CellView
,并将其设置为单元格内容视图,然后您可以自由更改CellView
的属性,并将其用作其他单元格类的内容视图
也许有更好的解决方案,但这就是我为类似外观的UIViewController所做的,您也可以尝试在故事板中不设置类的cell xib,并尝试加载它,看看错误是否仍然存在,你不能完全按照你想做的去做,因为类名在XIB中,所以你总是得到一个基类的实例,而不是你的任何子类
@Tj3n的建议很好,将公共部分提取到一个可重用视图中,并在超类初始化中创建该视图的实例并添加它。现在,当您实例化一个子类并调用super时,公共元素将由该子类初始化并可用
换句话说,使用组合来实现您的目标,而不是继承。如果要多次使用tableViewCell.xib,可以这样做。
首先转到文件并创建新文件(Cocoa Touch类)
使用.xib创建TableViewCell文件
现在简单地创建自定义单元设计
现在将此代码添加到文件TableViewCell.swift中
现在只需像这样在tableView单元格中添加标识符(您要在其中添加此自定义tableView单元格)
现在把它当作你的手机,就像这样
宾果,你明白了
现在只需将单元格添加为!任何TableViewController文件中的TableViewCell(使用相同的设计获得相同的结果。)
单击第一(加载第一个TableViewController)的此处
单击第二个(加载第二个TableViewController)
您不能这样做,因为注册表nb:
期望的是同一个已注册视图的实例
从这里,您可以复制NNVerticalStackTableViewCell.xib
并将NNVerticalStackTableViewCell.swift
保留为基类
然后创建类似于nnpropertiesUnprojectTableViewCell.xib
的东西,在这里,它使用添加的控件保持与以前完全相同的视图NNVerticalStackTableViewCell.xib
。然后将其子类化为NNPropertiesUnderProjectTableViewCell.swift
,并使用唯一标识:NNPropertiesUnderProjectTableViewCell
其中NNPropertiesUnderProjectTableViewCell
是NNVerticalStackTableViewCell
的子类
从这里开始,只需为NNPropertiesUnderProjectTableViewCell
类添加您独有的附加控件。您可以展示一个多个类使用同一个xib文件的示例吗?是的,我使用了相同的方法。但我希望有别的选择。