2010-09-03 15 views
12

有人可以解釋爲什麼你應該使用viewWithTagdequeueReusableCellWithIdentifier的單元格獲得子視圖(例如UILabel等)?我有一個自定義UITableViewCell與其中幾個UILabel s(我已經轉載了下面的簡單版本)。這些標籤在關聯的NIB文件中定義,並用IBOutlet s聲明並鏈接回自定義單元的控制器類。在桌面的dequeueReusableCellWithIdentifier,我這樣做:爲什麼在「dequeueReusableCellWithIdentifier」中使用「viewWithTag」?

CustomCell *customCell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCellId"]; 
if (customCell == nil) { 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"customCell" owner:self options:nil]; 
    for (id oneObject in nib) 
     if ([oneObject isKindOfClass:[CustomCell class]]) 
      customCell = (CustomCell *)oneObject; 
} 

customCell.firstLabel.text = @"Hello"; 
customCell.secondLabel.text = @"World!"; 

return customCell; 

一切工作正常。但是從我所看到的教程,它看起來改變標籤時,像我的值應改爲這樣:

UILabel *firstLabel = (UILabel *)[customCell.contentView viewWithTag:555]; 
firstLabel.text = @"Hello"; 

UILabel *secondLabel = (UILabel *)[customCell.contentView viewWithTag:556]; 
secondLabel.text = @"World!"; 

(標籤標籤值已經在NIB設置)。

有人可以告訴我哪種方法是首選,爲什麼?

謝謝!

回答

10

我意識到,如果通過編程方式將元素添加到單元格中(例如,未在NIB中定義並通過IBOutlets掛鉤),則使用「viewWithTag」檢索元素很有用 - 這可以防止多個標籤等爲單元格的每個實例創建。

+1

通常,您應該使用UITableViewCell子類來使用快速和骯髒的viewWithTag方法。 – 2013-07-10 01:16:31

1

我總是通過IBOutlets將子視圖掛鉤到我的UITableViewCell子類的屬性,就像你所做的那樣。我想不出任何使用viewWithTag的好理由。

13

viewWithTag:只是一種快速且骯髒的方式來取出子視圖,而不必在父級上設置IBOutlet屬性,甚至不必創建UITableViewCell子類。

對於非常簡單這是一個可接受的解決方案,這就是viewWithTag:的目的。但是,如果您要重複使用該單元格,或者希望它具有更適合開發人員的界面,那麼您將需要在第一個示例中繼承和使用真實屬性。

所以使用viewWithTag:如果它是一個非常簡單的單元格,您在IB中設計時沒有子類,只有幾個標籤。使用具有真實屬性的單元格子類來獲得更多實質性內容。

4

對我來說,viewWithTag是一個給定的上帝。首先:處理像taskinoor這樣的循環中的所有視圖非常簡單。另外,我個人比較喜歡這種方式,因爲如果我看一下代碼並想看看視圖會發生什麼,我只需搜索標籤即可。它用於視圖處理的任何地方。與xib方法相反,您必須查看代碼和xib。另外,如果你在xib中有一個離屏視圖,你可以監督它。 我發現了很多由其他程序員製作的xibs,這些xib都是滿的,有很多很多的視圖。一些隱藏的,一些在屏幕外的,無法分辨哪些是因爲所有重疊。 在這些情況下,我認爲xib是不好的。他們不容易閱讀。 我更喜歡用代碼編寫的所有東西。

但是,如果您決定使用標籤,請記住避免硬編碼任何標籤。相反,請使#define定義列表保持清潔和可讀。

0

從UITableViewCell類參考:「tableView:cellForRowAtIndexPath:中的表視圖委託應該在重用單元時始終重置所有內容。」保持簡單,清除內容視圖。這使得關於自定義單元格類,沒有廣播,沒有階級的檢查沒有假設:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; 
if (cell != nil) 
{ 
    NSArray* contentSubViews = [cell.contentView subviews]; 
    for (UIView* viewToRemove in contentSubViews) 
    { 
     [viewToRemove removeFromSuperview]; 
    } 
} 
0

viewWithTag:允許造型,而無需創建定製子類的UITableViewCell

您可以在Interface Builder將標籤分配和再利用標識爲原型UITableViewCell,然後出隊並修改UITableViewController的實現中包含該標籤的觀點,而不該小區爲小區的創建自定義類或創建IBOutlets子視圖。

在某些情況下,單元格的簡單性使得自定義類感覺像是過度殺傷。 viewWithTag:允許您將自定義文本和圖像添加到Storyboard中的單元格,然後通過代碼設置這些自定義,而無需向Xcode項目添加額外的類文件。

相關問題