2013-07-24 40 views
1
static NSString *cellID = @"Cell Identifier"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; 

if (!cell) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID]; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    [cell.contentView setBackgroundColor: [UIColor clearColor]]; 

    UIImage * box = [UIImage imageNamed: @"box.png"]; 
    UIView * cellbackgroundview = [[UIView alloc] initWithFrame: CGRectMake(7, 0, box.size.width, box.size.height)]; 
    [cellbackgroundview setBackgroundColor: [UIColor colorWithPatternImage: box]]; 

    UILabel * nameLabel = [[UILabel alloc] initWithFrame: CGRectMake(0, 15, box.size.width, 19.0f)]; 
    nameLabel.text = name; 
    [nameLabel setTextColor: [UIColor colorWithRed: 79.0f/255.0f green:79.0f/255.0f blue:79.0f/255.0f alpha:1.0f]]; 
    [nameLabel setFont: [UIFont fontWithName: @"HelveticaNeue-Bold" size: 18.0f]]; 
    [nameLabel setBackgroundColor: [UIColor clearColor]]; 
    nameLabel.textAlignment = NSTextAlignmentCenter; 
    nameLabel.tag = 1; 
    ..... 

} 

((UILabel *)[cell viewWithTag:1]).text = name; 
((UILabel *)[cell viewWithTag:2]).text = pitch; 

爲什麼有效地使用viewWithTag正如我上面做?爲什麼使用viewWithTag有效?

回答

6

我不同意答案。我認爲使用標籤通常不是一個好習慣,對您而言,這只是懶惰。您應該創建一個UITableViewCell子類,並將標籤作爲屬性。

邁克·凱勒wrote a post about it

讓我們假設你是不是想將數據存儲在一個視圖的標籤。相反,你只需要一個快速和骯髒的方法來獲取視圖的引用。在這些情況下使用標籤可以嗎?

好,幾乎在我能想到的每一種情況下,最好是使用存儲一個不動產某處視圖的參考,這是否是一個IBOutlet或只是在你的類常規屬性。

你需要一些自定義視圖添加到一個UITableViewCell?對它進行子類化並添加真實屬性。 (...)

通過使用真實的屬性,您可以獲得更強大的打字,更好的命名,更好的應用程序運動部分可見性,並且不必向下轉換viewWithTag的UIView *返回類型。您還可以獲得更好的性能,因爲viewWithTag:必須遍歷每個調用的視圖層次結構。

對我來說,使用標籤似乎是另一種模式被惰性所消磨純驅動。

4

我假設你沒有真正問的是效率,而是問效(即爲什麼做這種方式)。

您使用viewWithTag如果細胞被成功出隊/重複使用,所以你仍然可以訪問首次創建單元格時,你添加了相應的UILabel對象。你這樣做是出於功能原因(因爲你不想重新添加已經在重用單元格中的控件)。

所以,是的,這是一個很好的技術:分配一個tag指定一個標籤用於單元格中的特定目的,但在第一次創建單元格時使用viewWithTag來快速識別該標籤應用程序,當細胞被重新使用。我不會說這是爲了提高效率,而是爲了確保您不會在重用單元中不必要地創建冗餘控件。

值得一提的是,雖然這種技術在幾年前並不罕見,現在有一些消除神祕tag號碼,並通過使用故事板電池原型和UITableViewCell子的產生更清晰的代碼更優雅的辦法。

但有什麼不對你的技術。只是它通常不會被選作特別有效,而且現在,代碼易讀性的原因可能會使人們傾向於採用其他方法。

8

誰說它有效率?在什麼情況下?

,因爲它執行搜索視圖層次結構,找到視圖這是不是真的有效。有效的選擇是創建一個單元格子類,它具有您想要訪問的視圖的屬性,然後您可以在不進行任何搜索的情況下獲取引用。

0

在你的情況,沒有看到你的代碼的其餘部分,使用標記與UITableView沒有太大的意義。還有其他一些事情我會糾正。

但是,還有很多其他情況下使用標籤是首選。在我的情況下,我有一個應用程序正在創建幾個UIViews並將它們添加爲屏幕上現有UIViews的子視圖。與其在這裏和那裏獲得強有力的參考,我只是分配並保留自定義標記以隨時調用UIView。

我認爲:

[myView viewWithTag:BACKGROUND_CONSTANT] 

非常具有可讀性,避免我寫的子類或臃腫我的項目類擴展。此外,我瞭解搜索性能,但現在與過去相比(遠程過去)的設備是相當強大的,所以不要擔心強調與作品和任務的系統。最好的做法是始終運行一個分析器(XCode有一個好的分析器),測量並解決問題(如果有的話)。

相關問題