4

ストーリーボードで構成された静的なものを使用してUITableViewCell、いくつかの設定情報を表示しています。

他の設定の1つがオフになっている場合は、他のセルのいくつかを無効にする必要があります。

セルを適切な状態にするために、viewWillAppearNSUserDefaultsから設定を読み取り、それに応じてセルを変更します。

- (void) viewWillAppear:(BOOL)animated
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OtherCellEnabled"]) {
            [self otherCell].alpha = 1.0;
            [self otherCell].userInteractionEnabled = YES;
        }
        else {
            NSLog(@"Changing alpha to 0.3");
            [self otherCell].alpha = 0.3;
            [self otherCell].userInteractionEnabled = NO;
        }

問題は、実際にプログラムを実行すると、ログにアルファが変更されたと表示されていても、アルファが実際には変更されないことです。はuserInteractionEnabled固執しているように見えますが、アルファは1.0のままです。

他の設定は問題なく変更できるため、セルの再利用や、セルが時間内にインスタンス化されないという問題ではありません。

cell.alphaからcell.contentView.alphaに変更することはできますが、それは別の設定です。

alphaどういうわけか上書きされている設定を除いて、すべての設定が「固執」しているようです。

4

2 に答える 2

5

私はそれを解決することができたので、私自身の質問に答えています。

まず、アルファの変更を入れてみましたcellForRowAtIndexPathが、それもうまくいきませんでした。UITableViewCell何度もいじくり回した後、のアルファ設定は、上書きされ続けたり、1.0に設定されたりするという点で、なんとなく特別なものであるという結論に達しました。

私は2つの修正を見つけました:

まず、で変更を行う代わりにcellForRowAtIndexPathUITableViewDelegateメソッドで変更を行いwillDisplayCellます。何らかの理由で、このメソッドでセルのアルファを変更すると、実際には固定されます。もちろん、この方法で行う場合は、変更がセルごとに行われるようにロジックを再配置する必要があります。つまり、次のようになります。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell  
                                         forRowAtIndexPath:(NSIndexPath *)indexPath {
if (cell == [self otherCell]) {
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OtherCellEnabled"]) {
        cell.alpha = 1.0;
        cell.userInteractionEnabled = YES;
    }
    else {
        NSLog(@"Changing alpha to 0.3");
        cell.alpha = 0.3;
        cell.userInteractionEnabled = NO;
    }
}
}

私が言ったように、なぜこれが機能するのか正確にはわかりませんが、では機能しwillDisplayCellませんcellForRowAtIndexPath。他の人も不確かなようです:

-[UITableViewDelegate willDisplayCell:forRowAtIndexPath:]とは何ですか?

UITableViewCellで問題を引き起こすアルファ色のUITableView背景

もう1つの解決策は、問題のあるアルファを使用する代わりに、同じ効果を達成する別の設定を使用することです。私の場合、それはとでしcontentView.alphabackgroundColor。何らかの理由で、これらの設定は固定され、設定することもできviewWillAppear、期待どおりに機能します。

- (void) viewWillAppear:(BOOL)animated {
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OtherCellEnabled"]) {
            [self otherCell].backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
            [self otherCell].contentView.alpha = 1.0;
            [self otherCell].userInteractionEnabled = YES;
        }
        else {
            NSLog(@"Changing alpha to 0.3");
            [self otherCell].backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.3];
            [self otherCell].contentView.alpha = 0.3;
            [self otherCell].userInteractionEnabled = NO;
        }
}

2番目のアプローチの欠点は、ストーリーボードのセルの色設定を上書きしていることですが、気になる場合はストーリーボードに色を尋ねることで回避できます。

cell.alphaなぜ違う扱いを受けるのかわかりません。多分静的セルが実装される方法について何か。

于 2013-01-24T10:49:30.307 に答える
0

if { .. } else { .. }を使用して、セルの後にセルを再描画する必要があることを示唆することができますsetNeedsDisplay

[self otherCell setNeedsDisplay]

あなたのコメントに基づいて、どのように到達しotherCellますか? これは役立つかもしれない投稿ですか?

于 2013-01-24T10:29:32.583 に答える