2014-12-22 81 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方法中執行此操作,因爲一旦所有的網點都已連接,就會調用該方法。