2012-05-16 3 views
1

Я пытаюсь создать UITableView с пользовательским UIButton в каждой ячейке таблицы. Я реализовал, как это ..UITableViewCell с пользовательским 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.

Кто-то, пожалуйста, дайте мне рекомендации по устранению этой проблемы.

спасибо.

ответ

2

Когда вы просматриваете свой UITableView, скрытые ячейки больше не отображаются и могут быть повторно использованы для ячеек, которые становятся видимыми. Если новая ячейка становится видимой, вызывается tableView:cellForRowAtIndexPath:.

Проблема заключается в том, что вы устанавливаете состояние выбрано есть:

[couponCell.radioButton setSelected:NO]; 

Таким образом, всякий раз, когда вы перечисляете вашу ячейку из видимой области и обратно, он получает сброс к selected = NO.

Я предлагаю вам создать NSMutableDictionary, где вы сохраняете состояние выбора для каждой строки/NSIndexPath, которую затем повторно применяете в tableView:cellForRowAtIndexPath:.

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

в этом методе вы кнопка настройки, выбранные и для выбранной кнопки вы установили radio_blank.png изображение

+0

[self.radioButton setImage: [UIImage imageNamed: @ "radio_blank.png"] Форстат: UIControlStateNormal]; [self.radioButton setImage: [UIImage imageNamed: @ "radio_selected.png"] forState: UIControlStateSelected]; –

+0

Я не вижу никаких проблем: - # –

+0

в нажатой кнопке, я написал код выше. не здесь. кнопка находится в выбранном состоянии, а для выбранного сателлита ваше изображение - черное – Saad

2

заменить [couponCell.radioButton setSelected:NO]; в tableView:cellForRowAtIndexPath: с кодом, который устанавливает выбранное свойство в зависимости от состояния от вашего DATASOURCE ,

что-то вдоль этих линий:

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

Клетки в Tableview повторно используются, когда они перемещаются от экрана. Вы не можете сохранить состояние в них.

1

проблема, когда вы перечисляете таблицу в то время вашего cellForRowAtIndexPath: метод делегата вызывается для каждой строки ... так вот, когда его называли во время вашего setSelected вызова метода без аргументов, как сильфон ...

[couponCell ,radioButton setSelected: NO];

поэтому при прокрутке таблицы во время ваш setSelected метод вызова и кнопка поворота с radio_blank.png ... :)