0

这让我彻底疯了。

我有一个 UITableView,其中的单元格通过 NSFetchedResultsController 填充,它们的背景颜色应该基于核心数据参数之一设置。

此表视图位于 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 后面有时(而且只是有时?!?)忽略背景颜色。或导致单元格在选择时显示不正确。或者在没有背景颜色的情况下显示复选标记指示器。或者将新项目添加到显示在表格中的核心数据数据库中,但单元格没有背景颜色,但文本标签具有背景颜色。

无论我做什么,我都没有找到一种简单而直观的方法来使事情的整体表现符合预期 - 特别是在以编程方式选择单元格时。

事实上 - 单元格选择似乎可能是问题的根源。选定的单元格通常是在我将选择更改为另一个单元格后最终绘制不正确的单元格,特别是如果在选择单元格时单元格的颜色发生了变化。

有没有任何例子说明这应该如何工作?!?!

谢谢!

4

2 回答 2

0

如果我是你,我会创建一个UITableViewCell包含你自己的 UILabel 的子类,titleLabel/subtitleLabel并停止使用 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;
}

您也可以尝试设置单元格内容视图的背景颜色。

cell.contentView.backgroundColor = ...;

如果你真的想不通,那么在 UITableViewCell 子类中,你总是可以将自己的 UIView 放在单元格的背景中,然后更改该视图的背景颜色。

willDisplayCell:forRowAtIndexPath:在被调用后可能不会insertRowsAtIndexPaths:被调用(即,当您使用 fetchedresultscontroller 将项目添加到核心数据中时)。如果绝对有必要,也许你应该尝试设置单元格的背景颜色和它的 contentViewcellForRowAtIndexPath:willDisplayCell:forRowAtIndexPath:.

于 2012-06-20T23:10:25.243 回答
-3

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

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

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

于 2012-06-22T14:22:56.413 回答