UITableViewCell背景颜色基于NSFetchedResultsController - 奇怪的问题

时间:2012-06-11 06:59:04

标签: ios5 uitableview nsfetchedresultscontroller

这让我绝对疯了。

我有一个UITableView,其中的单元格是通过NSFetchedResultsController填充的,它应该根据其中一个Core Data参数设置背景颜色。

此表视图位于UISplitViewController的主视图中,所选单元格需要保持明显选择状态,以指示详细视图中显示的内容。

根据其他几个Stack Overflow问题的指导,我了解到配置单元格的理想位置是在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 个答案:

答案 0 :(得分:0)

如果我是你,我会创建一个UITableViewCell子类,其中包含您自己的titleLabel/subtitleLabel UILabel,并停止使用textLabel / detailTextLabel。在xib文件中,您只需更改标签和单元格的背景颜色即可。当我使用自定义单元格而不是默认单元格时,我从未遇到过您遇到的问题。

以下是如何从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;
}

您也可以尝试设置单元格contentView的背景颜色。

cell.contentView.backgroundColor = ...;

如果你真的无法搞清楚,那么在UITableViewCell子类中你总是可以在单元格的背景中放置你自己的UIView并改变那个视图的背景颜色。

调用willDisplayCell:forRowAtIndexPath:后可能无法调用{p> insertRowsAtIndexPaths:(即当您使用fetchedresultscontroller将项添加到核心数据中时)。如果绝对必要,您可以尝试设置单元格的背景颜色,并在cellForRowAtIndexPath:willDisplayCell:forRowAtIndexPath:中设置contentView。

答案 1 :(得分:-3)

出于某些奇怪的原因,UITableViewCell对象的背景颜色只能在绘制单元格之前设置。在你的UITableView的委托中实现这个方法:

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

在那里设置单元格的背景颜色,它将以您想要的方式绘制。