2014-12-22 34 views
1

每个这些调用不同的构造函数。字符串VS NSStringFromClass内dequeueReusableCellWithIdentifier

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)是不是真正落实。所以我想调用第一个构造函数。任何想法为什么第二行不会调用第一个构造函数?

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

+0

适当的技术取决于你如何实现你的UI:它是一个故事板细胞原型?一个NIB?或者是以编程方式实例化单元? – Rob

+0

我正在使用符合我指定和编程的类的Storyboard单元格原型 – user83039

+1

并且您将所有IBOutlet都连接到了单元格子类的属性?然后,第二个调用'initWithCoder'的'dequeueReusableCellWithIdentifier'是实例化自定义子类时故事板调用的适当方法。在initWithCoder方法中放入任何自定义初始化,或在'initWithCoder'完成时让'cellForRowAtIndexPath'做必要的附加配置。如果你不需要任何特殊配置(除了插座),那么你根本就不需要实现'initWithCoder' ...... – Rob

回答

2

如果您的电池安装在你的故事板原型细胞,比initCoder初始化是应该叫初始化。这是因为您的单元格已被编码到故事板文件中,并且正在通过对其进行反序列化来创建。 initStyle:reuseIdentifier:用于proramatically生成的单元格。

这两个调用产生不同结果的原因是,NSStringFromClass没有返回“MessageSentDataCell”正如您所料。 Swift类被强制包含它们的模块名称和其他信息,以便可以在不同模块中存在多个相同的类。

由于出队未失败,必须注册与单独的tableview使用相同NSStringFromClass方法的协议的MessageSentDateCell类。

你应该选择以编程方式加载细胞,并在故事板摆脱原型的,还是坚持到故事板。如果您需要对原型单元格进行额外的设置,则应该在您的单元格子类的awakeFromNib方法中执行此操作,因为一旦所有的网点都已连接,就会调用该方法。