2017-05-27 168 views
1

根據官方文檔,有兩種方法從tableView的隊列中獲取可重用單元。一個是dequeueReusableCell(withIdentifier:for:),另一個是dequeueReusableCell(withIdentifier:)。假設從文檔的解釋中,我認爲前者是返回可重用單元格的方法,並將其添加到tableView。另一方面,後者是剛剛返回可重用單元的方法。 這是正確的嗎?iOS:dequeueReusableCell(withIdentifier:for :)和dequeueReusableCell(withIdentifier :)之間有什麼區別?

如果是對的,我還有一個問題。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell: UITableViewCell = self.tableView.dequeueReusableCell(with: SomeTableViewCell.self, for: indexPath) 
    let anotherCell: UITableViewCell = self.tableView.dequeueReusableCell(with: AnotherTableViewCell.self) 
    return anotherCell 
} 

在第一線,我們就可以得到可重複使用的電池,並添加celltableView。而在第二個,我們只是獲得另一個可重用的單元格。最後,該方法返回從第二行獲取的單元格。返回的單元格與已添加到tableView的單元格不同。 在這種情況下,在第一行添加到tableView的單元格剛好在最後一行被返回的單元格替換? 謝謝。

+4

的可能的複製[當使用dequeueReusableCellWithIdentifier VS dequeueReusableCellWithIdentifier:forIndexPath(https://stackoverflow.com/questions/25826383/when-to-use-dequeuereusablecellwithidentifier-vs-dequeuereusablecellwithidentifi) –

+0

您可以從這個參考答案 - https://stackoverflow.com/a/25835438/5237727 –

+0

你見過文檔的解釋嗎?你展示的答案可以是答案。但是,它不包括這個問題。我將重點放在解釋上,即只返回單元格而另一個返回單元格並將其添加到表格視圖中。我想問我的解釋是否正確。 –

回答

1

看過the official documentation之後,我意識到您的解釋有些不正確。

您能否看看this答案,因爲這可能會帶來更多的清晰度。

+0

您能否看到https://developer.apple.com/reference/uikit/uitableview/1614878-dequeuereusablecell?解釋似乎與您的答案相矛盾,因爲您說獲取的單元格從未添加到表格視圖中,並且該文檔表示返回該單元格並將其添加到表格視圖中。 –

+0

@Kazuya Tomita:請檢查我的最新答案。 –

+0

如果答案有幫助,也可以upvote。謝謝 –

4

方法dequeueReusableCell(withIdentifier:)大於dequeueReusableCell(withIdentifier:for:),它們之間的主要區別是,如果單元格沒有註冊,第一個將返回nil,第二個將拋出異常,並且應用程序將崩潰。 IndexPath需要進行身高計算(如果定義爲tableView:heightForRowAtIndexPath

+0

謝謝,文檔中提到「爲指定的重用標識符返回一個可重用的表視圖單元對象並將其添加到表中」,作爲「dequeueReusableCell(withIdentifier:for :)」的解釋。你怎麼看待這件事? –

+0

這意味着如果未創建此類型單元格,或者表視圖沒有足夠的此單元格實例,它將創建它,否則它將返回已創建的實例以供重用。 –

+0

我可以逐漸理解,但是「返回一個指定的重用標識符的可重複使用的表視圖單元對象並將其添加到表」中的「表」?是不是桌子視圖? –

0

dequeueReusableCell(withIdentifier:)dequeueReusableCell(withIdentifier:for:)

兩個返回細胞,但舊的方法返回而最新方法崩潰的應用程序。

年長

可支持高達的iOS 5而新方法的支持的iOS 6以上

0

如果你會使用以下方法,你總是初始化實例,它總是會爲大小合適indexpath,因此您可以在contentview中進行佈局,以瞭解大小是否正確。因爲這會在返回之前設置單元格大小,這就是爲什麼我們需要添加indexPath

let cell: UITableViewCell = self.tableView.dequeueReusableCell(with: 
    "Cell", for: indexPath) 

在下面的情況下,你必須檢查單元格是否爲零,自己配置它。

var cell:UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: "Cell") 

    if (cell == nil) { 

     cell = UITableViewCell(style:UITableViewCellStyle.subtitle, reuseIdentifier:"Cell") 
    } 

注:在較新的版本,如果即self.tableView.dequeueReusableCell(with: "Cell", for: indexPath)應用程序崩潰,你沒有註冊的標識類/筆尖。在舊版本中,即tableView.dequeueReusableCell(withIdentifier: "Cell")版本在這種情況下返回零。此外,如果您使用storyboard,則無需擔心註冊單元。

dequeueReusableCellWithIdentifier:forIndexPath:將始終返回一個單元格。另一方面,dequeueReusableCellWithIdentifier:將返回零,如果沒有可重用的單元這就是爲什麼零檢查是必需的。

相關問題