目标是使用通用XIB文件来显示各种对象。为此,我创建了XIB并将它的IBOutlets连接到UITableView子类MyCustomCell
class MyCustomCell:UITableViewCell {
@IBOutlet weak var myLabel:UILabel!
}
此单元格应该能够显示来自两种类型对象的数据,并且它增强了使单元格处理其自身填充而不是从tableViewDelegate访问myLabel
的便利性,因此需要两个单独的子类:
class ObjectTypeATableViewCell:MyCustomCell {
var record:ObjectTypeA! {
didSet {
myLabel.text = record.name
}
}
}
class ObjectTypeBTableViewCell:MyCustomCell {
var record:ObjectTypeB! {
didSet {
myLabel.text = String(record.totalQty)
}
}
}
这一切都很好。然而,问题在于重用TableView上的单元格。以下是我正在使用的实现。
class MyTable: UITableView, UITableViewDataSource {
var records:Array<AnyObject>()
/// Run when the tableView is loaded
func xibSetup() {
let nib = UINib(nibName: "MyCustomCell", bundle: nil)
registerNib(nib, forCellReuseIdentifier: "recordCell")
dataSource = self
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let object = sectionedItems().itemsInSections[indexPath.section][indexPath.row]
if let i = object as? ObjectTypeA {
let cell = dequeueReusableCellWithIdentifier("recordCell") as! ObjectTypeATableViewCell
cell.record = i
return cell
} else if let i = object as? ObjectTypeB {
let cell = dequeueReusableCellWithIdentifier("recordCell") as! ObjectTypeBTableViewCell
cell.record = i
return cell
} else {
let cell = UITableViewCell()
cell.textLabel?.text = "unknown object type."
return cell
}
}
}
当单元格出列时发生致命错误:
Could not cast value of type 'MyProject.MyCustomCell' (0x10ade39e0) to 'MyProject. ObjectTypeATableViewCell' (0x10ade3e20).
如何将单元格正确地转换为子类?
答案 0 :(得分:2)
不需要子类MyCustomCell,您可以声明要使用的协议如下:
protocol ObjectTypeProtocol {
func getText() -> String
}
class ObjectTypeA : ObjectTypeProtocol{
var name = "name of ObjectTypeA"
//....
func getText() -> String {
return name
}
}
class ObjectTypeB : ObjectTypeProtocol{
var totalQty = "total of ObjectTypeB"
//....
func getText() -> String {
return String(totalQty)
}
}
class MyCustomCell: UITableViewCell {
@IBOutlet var myLabel:UILabel!
var record:ObjectTypeProtocol! {
didSet {
myLabel.text = record.getText()
}
}
}
答案 1 :(得分:0)
尝试更改tableView注册类,如下所示:
tableView.registerClass(ObjectTypeATableViewCell.self, forCellReuseIdentifier: "ObjectTypeATableViewCell")
要解决您的问题,您可能应该创建另一个自定义视图,只需命名为&#34; MyCustomCellContentView&#34;,它继承自UIView
,同时创建一个名为&#34; MyCustomCellContentView&#34的xib文件;。设置xib class
&#34; MyCustomCellContentView&#34;
在该步骤之后,您应该将MyCustomCell
中的视图移至MyCustomCellContentView
,然后删除MyCustomCell.xib
文件。链接MyCustomCellContentView
中的标签。使用@IBOutlet weak var myLabel:UILabel!
var myLabel : UILabel?
然后覆盖init(style: UITableViewCellStyle, reuseIdentifier: String?)
中的MyCustomerCell
:
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
let nib = NSBundle.mainBundle().loadNibNamed("MyCustomCellContentView",owner: nil, options: nil).first
let view = nib as! MyCustomCellContentView
myLabel = view.label
contentView.addSubview(view)
}
最后,覆盖layoutSubViews
:
override func layoutSubviews() {
super.layoutSubviews()
label!.superview!.frame = self.bounds
}