使用iOS 6時設置UITableViewCell的樣式UITableView dequeueReusableCellWithIdentifier:forIndexPath:


2 Answers

dequeueReusableCellWithIdentifier不被棄用,因此您不需要使用新的dequeueReusableCellWithIdentifier:forIndexPath:

如果您正在使用自定義單元類,請使用新方法以及適當的註冊方法(在viewDidLoad中),但如果您想使用其中一個UITableViewCellStyle枚舉,請使用舊方法。

Question

我試圖解決如何設置UITableViewCellStyle時使用iOS 6的新方法的UITableView

以前,在創建UITableViewCell我會在調用initWithStyle:時更改UITableViewCellStyle枚舉以創建不同類型的默認單元格initWithStyle:但從我可以收集的內容來看,情況已不再是這樣。

UITableView的Apple文檔指出:

返回值 :具有相關重用標識符的UITableViewCell對象。 此方法始終返回有效的單元格。

討論 :出於性能方面的原因,表視圖的數據源通常應該在將單元格分配給其tableView:cellForRowAtIndexPath:方法中的行時重用UITableViewCell對象。 表視圖維護數據源標記為可重用的UITableViewCell對象的隊列或列表。 當被要求提供表格視圖的新單元格時,從數據源對象調用此方法。 此方法將取出現有單元格(如果有),或根據您之前註冊的類或nib文件創建新單元格。

重要說明:在調用此方法之前,必須使用registerNib:forCellReuseIdentifier:或registerClass:forCellReuseIdentifier:方法註冊類或nib文件。

如果您為指定的標識符註冊了一個類並且必須創建一個新的單元格,則此方法通過調用其initWithStyle:reuseIdentifier:方法來初始化該單元格。 對於基於筆尖的單元格,此方法從提供的nib文件加載單元格對象。 如果現有單元可供重用,則此方法將調用單元的prepareForReuse方法。

這是我的新的cellForRowAtIndexPath在實現新方法後的樣子:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"cell_identifier";

    [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    return cell;
}

我到目前為止的代碼工作正常,但總是返回默認樣式。 我怎樣才能改變這個,所以我可以創建其他樣式的單元格,如UITableViewCellStyleDefaultUITableViewCellStyleValue1UITableViewCellStyleValue2UITableViewCellStyleSubtitle

我不想子類UITableViewCell ,我只是想改變默認類型,就像我在iOS 6之前所做的那樣。Apple似乎很奇怪提供增強的方法,但只需最少的文檔來支持它們的實現。

有沒有人掌握了這一點,或遇到類似的問題? 我努力尋找任何合理的信息。




保存一個文件的另一種方法是創建一個Nib並使用registerNib:forCellReuseIdentifier:來代替。

製作筆尖很簡單:在Interface Builder中創建一個新的.xib文件。 刪除默認視圖。 添加一個Table View Cell對象。 使用屬性檢查器,更改單元格的樣式。 (在這裡您還有機會通過調整其他屬性來進一步定制單元格。)

然後在你的表格視圖控制器的viewDidLoad方法中調用如下所示:

[self.tableView registerNib:[UINib nibWithNibName:@"StyleSubtitleTableCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"Cell"];



我的解決方案是調用initWithStyle: reuseIdentifier:在我使用[self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath]獲得它之後。 畢竟, init只是另一個選擇器,編譯器不會在已經初始化的對像上調用它。 然而,它會抱怨不使用調用init的結果,所以我這樣做:

UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath];
cell = [cell initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cellId"];

我想這在Swift中不起作用...






Related