子类化UITableViewCell子类

时间:2016-02-25 02:09:25

标签: ios subclass uitableview

目标是使用通用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).

如何将单元格正确地转换为子类?

2 个答案:

答案 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;

enter image description here

在该步骤之后,您应该将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
}