0

これは私を完全に狂わせています。

NSFetchedResultsControllerを介してセルが入力されたUITableViewがあり、コアデータパラメーターの1つに基づいて背景色が設定されている必要があります。

このテーブルビューはUISplitViewControllerのマスタービューにあり、詳細ビューに何が表示されているかを示すために、選択したセルを視覚的に選択したままにする必要があります。

他のいくつかのStackOverflowの質問からのガイダンスに基づいて、セルを構成する理想的な場所は、次のような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、独自の UILabels を含むサブクラスを作成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;
}

セルの contentView の背景色を設定することもできます。

cell.contentView.backgroundColor = ...;

本当に理解できない場合は、 UITableViewCell サブクラスで、セルの背景に独自の UIView を常に配置し、代わりにそのビューの背景色を変更できます。

willDisplayCell:forRowAtIndexPath:が呼び出された後に呼び出されない可能性がありますinsertRowsAtIndexPaths:(つまり、fetchedresultscontroller を使用してコア データにアイテムを追加する場合)。絶対に必要な場合は、セルの背景色を設定してみてください。それは contentView と の両方cellForRowAtIndexPath:です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 に答える