dequeueReusableCellWithIdentifier中的String vs NSStringFromClass

时间:2014-12-22 00:50:40

标签: ios swift

每个都调用不同的构造函数。

let cell = tableView.dequeueReusableCellWithIdentifier(NSStringFromClass(MessageSentDateCell), forIndexPath: indexPath) as MessageSentDateCell
let cell = tableView.dequeueReusableCellWithIdentifier("MessageSentDateCell", forIndexPath: indexPath) as MessageSentDateCell

热门电话:

override init(style: UITableViewCellStyle, reuseIdentifier: String?)

第二行称为:

required init(coder aDecoder: NSCoder)

但是,在我提到的示例项目存储库中,required init(coder aDecoder: NSCoder)并未真正实现。所以我想调用第一个构造函数。任何想法为什么第二行不会调用第一个构造函数?

是的,类名和标识符是相同的。

1 个答案:

答案 0 :(得分:3)

如果您将单元格设置为故事板中的原型单元格,则initCoder初始化程序是应该调用的初始化程序。这是因为您的单元格已编码到故事板文件中,并通过反序列化来创建。 initStyle:reuseIdentifier:用于按比例生成细胞。

这两个调用产生不同结果的原因是NSStringFromClass没有像您期望的那样返回“MessageSentDataCell”。 Swift类被修改为包含其模块名称和其他信息,以便您可以在不同的模块中存在多个相同的类。

由于dequeue没有失败,所以你必须使用相同的NSStringFromClass方法将tableview与tableview分开注册MessageSentDateCell类。

您应该选择以编程方式加载单元格并在故事板中删除原型,或者坚持使用故事板。如果你需要为原型单元进行额外的设置,你应该在你的单元子类的awakeFromNib方法中进行,因为一旦所有出口都已连接就会被调用。