2010-01-28 52 views
50

從官方文件:iPhone - 什麼是重用標識符(UITableViewCell)?

重用標識符與一個UITableViewCell對象表視圖的委託以意向重新用作基礎(出於性能原因)創建一個表視圖的多個行相關聯。它被分配給initWithFrame中的單元對象:reuseIdentifier:並且此後不能更改。 UITableView對象維護當前可重用單元的隊列(或列表),每個單元都有自己的重用標識符,並使它們在dequeueReusableCellWithIdentifier:方法中可供委託使用。

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/reuseIdentifier

我不明白這一點。好吧,我理解你創建UITableViewCells的基本思想,並儘可能多地重複使用,而不是創建新的(或類似的東西)。但究竟決定一個單元是否可重用?如果我有兩個完全相同的(可視化的)單元格,但有不同的文本(我想它們不完全相同),它們都可以具有相同的標識符嗎?或者他們應該有不同的?或者在什麼情況下你應該使用不同的標識符?

任何人都可以澄清或鏈接到它的地方?

回答

65

好吧,這是我認爲它的工作原理:

使用dequeueReusableCellWithIdentifier爲的tableView,可以大大加快速度。您可以根據需要實例化多個單元格,而不是實例化很多單元格,即可以看到多個單元格(這是自動處理的)。如果滾動到列表中存在尚未得到其可視化表示的「單元格」的區域,而不是實例化新單元格,則可以重用已存在的單元格。

你可以這樣做自己試用:

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) 
{ 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    NSLog(@"new one"); 
} 
else 
{ 
    NSLog(@"old one"); 
} 

記住,你只是想dequeueReusableCellWithIdentifier返回一個細胞,如果它是適用的。所以如果一個單元格將被重用,請確保它適合這種情況。這是reuseIdentifiers的用途。通常,你只需要一個。但是可能有一個列表使用了幾種不同類型的單元格,在這種情況下,您必須通過提供不同的reuseIdentifiers來使它們保持分離。否則,你最終可能會得到一個你認爲是其他類型的單元格的單元格(例如,UITableView單元格而不是你想要的自定義單元格)。

所以基本上,據我所知,使用不同的reuseIdentifiers不同類型的單元格,其中kind意味着類。如果您只使用標準單元格,則可能只需要一個reuseIdentifier。

這種設計模式被稱爲object pooling

+14

我一直在開發iPhone很長一段時間,磕磕絆絆這個視頻在這個答案很多澄清了這個話題。 – 2010-11-21 17:27:51

+0

很好的解釋:) – Karun 2014-09-16 06:51:26

+0

對象池正確的術語之一upvote那 – Shajo 2015-03-11 14:31:00

10

我想補充一些東西quano的,否則很好的答案:(我嘗試添加爲評論,但它是太長了!)

即使重用標識符可以在發展中被省略,儘管這必須是在非常特殊的情況下完成。如果您有6-7個單元格的表格視圖,並且每個單元格都不相同,則可能會發現創建一個新標識符爲nil的單元格可能更可取。

擁有可重複使用的單元格意味着每次調用cellForRowAtIndexPath時,都必須檢查單元格,如果沒有可重用單元格,則初始化該單元格,並且在init範圍之外,必須明確地遍歷所有可能的索引路徑並設置每個標籤的值明確取決於您擁有的細胞種類!因此,在10個dinstinct單元格的表格視圖中,如果爲零,則必須注意創建單元格,並根據創建的內容填充單元格。

因此,在這種情況下,在代碼維護方面優先使用零標識符來初始化每個單元(因爲它不會被重複使用)並適當地填充每個單元的信息,而不用擔心重複使用它。

相關問題