2012-06-11 83 views
0

這讓我絕對瘋了。基於NSFetchedResultsController的UITableViewCell背景顏色 - 奇怪的問題

我有一個UITableView單元格填充通過NSFetchedResultsController應該有他們的背景顏色設置基於其中一個核心數據參數。

此表視圖位於UISplitViewController的主視圖中,並且所選單元格需要保持可見狀態,以指示在詳細視圖中顯示的內容。

基於來自其他幾個堆棧溢出問題的指導,我已經瞭解到,可以將單元配置的理想場所是willDisplayCell代表通話過程中,像這樣:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
WorkTask *workTask = (WorkTask*) [self.fetchedResultsController objectAtIndexPath:indexPath]; 

if ([workTask.strStatus isEqualToString:@"A"]) { 
    cell.backgroundColor = [self colorWithHexString:@"fffdcf"]; 
    // cell.textLabel.backgroundColor = [self colorWithHexString:@"fffdcf"]; 
    // cell.detailTextLabel.backgroundColor = [self colorWithHexString:@"fffdcf"]; 

} else if ([workTask.strStatus isEqualToString:@"B"]) { 
    cell.backgroundColor = [self colorWithHexString:@"cfffd1"]; 
    // cell.textLabel.backgroundColor = [self colorWithHexString:@"cfffd1"]; 
    // cell.detailTextLabel.backgroundColor = [self colorWithHexString:@"cfffd1"]; 

} else if ([workTask.strStatus isEqualToString:@"C"]) { 
    cell.backgroundColor = [self colorWithHexString:@"ffcfcf"]; 
    // cell.textLabel.backgroundColor = [self colorWithHexString:@"ffcfcf"]; 
    // cell.detailTextLabel.backgroundColor = [self colorWithHexString:@"ffcfcf"]; 
} else { 
    cell.backgroundColor = [self colorWithHexString:@"ffffff"]; 
    // cell.backgroundColor = cell.contentView.backgroundColor; 
} 

這主要類型的作品。但是...

根據我如何使用不同的變體完成此操作,我最終會忽略textLabel和detailTextLabel後面的背景顏色(有時只是?!?)。或者在選中時導致單元顯示不正確。或者在沒有背景顏色的情況下顯示覆選標記指示器。或者將新項目添加到表格中顯示的核心數據庫中,但是單元格沒有背景顏色,但文本標籤具有背景顏色。

無論我做什麼,我都沒有找到一種簡單而直觀的方式來使事情的行爲與預期的一樣 - 特別是當程序選擇單元格時。

實際上 - 單元選擇看起來可能是問題的根源。選中的單元格通常是在將選區更改爲另一個區域後最終繪製不正確的單元格,特別是在選中單元格時單元格顏色發生更改的情況下。

有沒有什麼地方有這個應該如何工作的地方?!?!

謝謝!

+2

你試過分配一個'cell.selectedBackgroundView'和'cell.backgroundView'嗎?這似乎解決了與細胞選擇有關的許多問題。 – Raspu

+0

我將覆蓋'-setHighlighted:'(在您的單元格子類中) – nielsbot

回答

0

如果我是你,我會創建一個UITableViewCell子類,其中包含自己的titleLabel/subtitleLabel UILabel,並停止使用textLabel/detailTextLabel。在xib文件中,您可以更改標籤和單元格的背景顏色。當我使用自定義單元格而不是默認單元格時,我從未遇到過類似的問題。

下面是如何從廈門國際銀行加載的UITableViewCell一個例子:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"]; 
    if (cell == nil) { 
     // Load the top-level objects from the custom cell XIB. 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil]; 
     // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain). 
     cell = [topLevelObjects objectAtIndex:0]; 
    } 

    cell.titleLabel.text = @"whatever"; 
    cell.subtitleLabel.text = @"whatever"; 

    return cell; 
} 

您也可以嘗試設置單元格的內容查看的背景色。

cell.contentView.backgroundColor = ...; 

如果你真的無法弄清楚,然後在一個UITableViewCell子類,你可以永遠只是把自己的一個UIView在單元格的背景和改變視圖的背景顏色來代替。

willDisplayCell:forRowAtIndexPath:可能在調用insertRowsAtIndexPaths:後(即將項添加到具有fetchedresults控制器的核心數據中)後不會被調用。如果絕對必要,也許你應該嘗試設置單元格的背景顏色,它的內容視圖都在cellForRowAtIndexPath:willDisplayCell:forRowAtIndexPath:之間。

+0

「在xib文件中,您可以更改標籤和單元格的背景顏色。」 - 問題在於我正在根據由Core Data管理的屬性動態更改背景顏色。返回一個已配置的單元很容易 - 在飛行中正確更改顏色就是問題所在。有什麼想法嗎? – radven

+0

我仍然認爲嘗試一個自定義單元格是值得的。您仍然可以更改willDisplayCell中的背景色:以及可能在cellForRowAtIndexPath:中的事件。 –

+0

我會嘗試改變周圍使用自定義單元格,並會在這裏報告。同時,由於沒有其他人提供更好的答案,所以賞金是你的。謝謝! – radven

-3

由於一些奇怪的原因,UITableViewCell對象的背景顏色只能在繪製單元之前設置。在你的UITableView的代表實現這個方法:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

設置單元格的背景顏色,它會繪製你想要的方式。

+0

你看過他的問題嗎?這是他設置它的地方。 – lnafziger