0

これは、プレーン スタイルのテーブル ビューでは正常に機能しますが、グループ化されたスタイルでは機能しません。セルが選択されたときのセルの外観をカスタマイズしようとしています。

これが私のコードです:

+ (void)customizeBackgroundForSelectedCell:(UITableViewCell *)cell {
    UIImage *image = [UIImage imageNamed:@"ipad-list-item-selected.png"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    cell.selectedBackgroundView = imageView;
}

正しいセルが実際にこの関数に渡されていることを確認しました。これを機能させるには、他に何をする必要がありますか?

4

1 に答える 1

1

tableViewCell が選択状態に基づいて selectedBackgroundView の表示/非表示を自動的に管理することを認識しているかどうかは、あなたの質問からは明らかではありません。以外にそのメソッドを配置するのにはるかに適した場所がありますviewWillAppear。1 つは、最初に tableViewCells を作成するときです。つまり、次のようになります。

- (UITableViewCell *)tableView:(UITV*)tv cellForRowAtIP:(NSIndexPath *)indexPath {
    UITableViewCell *cell = nil;
    cell = [tv dequeueCellWithIdentifier:@"SomeIdentifier"];
    if (cell == nil) {
        cell = /* alloc init the cell with the right reuse identifier*/;
        [SomeClass customizeBackgroundForSelectedCell:cell];
    }
    return cell;
}

selectedBackgroundView プロパティを設定する必要があるのは、そのセルの有効期間内に1 回だけです。セルは、必要に応じて表示/非表示を管理します。

別のよりクリーンな手法は、UITableViewCell をサブクラス化し、サブクラスの .m ファイルでオーバーライドすることです。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithBla....];
    if (self) {
        UIImageView *selectedBGImageView = /* create your selected image view */;
        self.selectedBackgroundView = selectedBGImageView;
    }
    return self;
}

それ以降、セルには、それ以上変更を加えることなく、カスタム選択さ​​れた背景が表示されるはずです。それだけで機能します。

viewDidLoad:さらに、このメソッドは、次の UITableView メソッドを使用して、テーブル ビュー セル クラスをテーブル ビューに登録する現在推奨されている方法でうまく機能します。

- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier

テーブル ビュー コントローラーのメソッドでこのメソッドを使用するviewDidLoadと、テーブル ビュー セルのデキューの実装がはるかに短くなり、読みやすくなります。

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.tableView registerClass:[SomeClass class]
           forCellReuseIdentifier:@"Blah"];
}

- (UITableViewCell *)tableView:(UITV*)tv cellForRowAtIP:(NSIndexPath *)indexPath {
    UITableViewCell *cell = nil;
    cell = [tableView dequeueReusableCellWithIdentifier:@"Blah"
                                           forIndexPath:indexPath];
    /* set your cell properties */
    return cell;
 }

このメソッドは、識別子を使用してクラスを登録している限り、セルを返すことが保証されてい@"Blah"ます。

于 2013-07-15T00:29:50.067 に答える