我正面临一个问题
我有一个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 name
为:NNVerticalStackTableViewCell
和cell identifier
为: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)
}
}
现在我要做的是使用带有NNPropertiesUnderProjectTableViewCell
接口的NNVerticalStackTableViewCell.xib
类。
与NNPropertiesUnderProjectTableViewCell
类似,我有许多其他类使用与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).
任何人都可以建议如何解决问题。我想使用单.xib
而不想重复代码。
答案 0 :(得分:5)
您可以使用类似的UITableViewCell
UIView
为单元格内容视图创建一个xib,为其提供一个类(如CellView
)。
在每个单元格类中,使用CellView
获取loadNibNamed
并将其设置为单元格内容视图,然后您可以自由更改CellView
的属性并将其用作其他单元格类的内容视图
也许有更好的解决方案,但这就是我为类似的UIViewController
做的,你也可以在storyboard中尝试没有类设置的单元xib并尝试加载它,看看错误是否仍然存在< / p>
答案 1 :(得分:3)
您不能这样做,因为registerNib:
期望与确切注册的视图相同的实例。
您可以在此处复制NNVerticalStackTableViewCell.xib
并保留NNVerticalStackTableViewCell.swift
作为您的基类。
然后创建类似NNPropertiesUnderProjectTableViewCell.xib
的内容,其中包含与NNVerticalStackTableViewCell.xib
之前完全相同的视图以及添加的控件。然后使用唯一标识符NNPropertiesUnderProjectTableViewCell.swift
将其子类化为NNPropertiesUnderProjectTableViewCell
。
其中NNPropertiesUnderProjectTableViewCell
是NNVerticalStackTableViewCell
的子类。
从这里开始,只需添加NNPropertiesUnderProjectTableViewCell
类唯一的附加控件。
答案 2 :(得分:2)
如果要在多个时间内使用tableViewCell.xib,可以这样做。 首先转到文件并创建新文件(Cocoa Touch Class)。
使用.xib创建TableViewCell文件
现在简单创建自定义单元格设计
现在在File TableViewCell.swift中添加此代码
现在只需在tableView Cell中添加标识符(如果要添加此自定义TableviewCell)
现在把它当作你的手机就像这样......
宾果你明白了..
现在只需将单元格添加为!任何TableViewController文件中的TableViewCell(您使用相同的设计获得相同的结果。)
Click First(加载第一个TableViewController)
单击第二个(加载第二个TableViewController)
答案 3 :(得分:1)
基本上,你不能完全按照你要做的那样做,因为类名在XIB中,所以你总是得到基类的实例,而不是你的任何子类。
来自@ Tj3n的建议很好,将公共部分提取到可重用的视图中,并在您的超类初始化中创建该视图的实例并添加它。现在,当您实例化一个子类并且它调用super时,公共元素将被子类初始化和使用。
换句话说,使用组合来实现目标,而不是继承。
答案 4 :(得分:0)
NNPropertiesUnderProjectTableViewCell未注册Cellidentifier。