1

各テーブルセルにUITableViewカスタムを使用してを作成しようとしています。UIButton私はこのように実装しました。

@implementation CouponDetailsCustomTableViewCell

          ...............

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
        [self setBackgroundColor:[UIColor whiteColor]];

        CGRect frame = self.contentView.frame;

        self.radioButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [self.radioButton setImage:[UIImage imageNamed:@"radio_blank.png"] forState:UIControlStateNormal];
        [self.radioButton setImage:[UIImage imageNamed:@"radio_selected"] forState:UIControlStateSelected];
        [self.radioButton setFrame:CGRectMake(16, 10, 29, 29)];
        [self.radioButton addTarget:nil action:@selector(radioButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:radioButton];
}


@end

およびUITableViewデリゲートとして......

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *COUPON_CELL_ID = @"CouponCell" ;

    CouponDetailsCustomTableViewCell * couponCell = (CouponDetailsCustomTableViewCell *) [tableView dequeueReusableCellWithIdentifier:COUPON_CELL_ID];
    if (couponCell == nil) {
        couponCell = [[[CouponDetailsCustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:COUPON_CELL_ID] autorelease];
        couponCell.selectionStyle = UITableViewCellSelectionStyleNone;

    }
    [couponCell.radioButton setSelected:NO];
    return couponCell;
}

そしてradioButtonPressedメソッドは

-(void)radioButtonPressed:(id) sender
{
     [sender setSelected:YES];
}

UIButtonプログラムを実行すると、すべてのテーブル行にカスタムが表示されます。ボタンをクリックすると、選択されます(が表示されますradio_selected.png)。

テーブルを下にスクロールすると問題が発生します(ウィンドウにテーブルの4行のみが表示されています)。もう一度上にスクロールすると、クリックしたボタンが表示されますradio_blank.png

私はiPhone開発の初心者です。なぜこれが起こっているのか分かりません。私が推測できるほとんどのことは、ボタンのプロパティが変更されていることです setSelected:NO

誰かが私にこの問題を解決するための提案をしてください。

ありがとうございました。

4

4 に答える 4

2

dataSourceの状態に応じて、選択したプロパティを設定するコードに[couponCell.radioButton setSelected:NO];置き換えます。tableView:cellForRowAtIndexPath:

それらの線に沿った何か:

/* get the button state from your data source */
FancyCouponObject *coupon = [self.coupons objectAtIndex:indexPath.row];
BOOL buttonState = coupon.buttonState;
[couponCell.radioButton setSelected:buttonState];

tableViewのセルは、画面外に移動したときに再利用されます。それらに状態を保存することはできません。

于 2012-05-16T09:15:14.513 に答える
2

UITableViewをスクロールすると、非表示のセルはレンダリングされなくなり、表示されるようになるセルに再利用される可能性があります。新しいセルが表示されるようになると、tableView:cellForRowAtIndexPath:呼び出されます。

問題は、そこで選択した状態を設定していることです。

[couponCell.radioButton setSelected:NO];

したがって、セルを表示領域からスクロールして元に戻すと、セルはにリセットされselected = NOます。

NSMutableDictionary各行/NSIndexPathの選択状態を保存する場所を作成し、それをに再適用することをお勧めしますtableView:cellForRowAtIndexPath:

于 2012-05-16T09:20:50.950 に答える
1

問題は、その時点でテーブルをスクロールすると、cellForRowAtIndexPath:デリゲートメソッドがすべての行を呼び出したためです...したがって、ここで呼び出されたときに、次のsetSelectedような引数なしでメソッドが呼び出されます...

[couponCell.radioButton setSelected:NO];

したがって、setSelectedメソッド呼び出し時にテーブルをスクロールすると、radio_blank.pngでボタンが回転します... :)

于 2012-05-16T09:21:05.537 に答える
0
-(void)radioButtonPressed:(id) sender
{
     [sender setSelected:YES];
}

この方法では、ボタンを選択済みに設定し、選択したボタンにradio_blank.png画像を設定します

于 2012-05-16T09:13:26.567 に答える