2012-05-16 140 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”] forState:UIControlStateNormal]; [self.radioButton setImage:[UIImage imageNamed:@“radio_selected.png”] forState:UIControlStateSelected]; –

+0

我没有看到任何问题: - # –

+0

在你按下的按钮,我写了上面的代码。不在这里。该按钮处于选定状态,对于选定状态,图像为黑色 – Saad

2

tableView:cellForRowAtIndexPath:与代码替换[couponCell.radioButton setSelected:NO];,设置选定的属性取决于您的数据源的状态。

类似的规定:在移动时关闭屏幕

/* 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:委托方法滚动表...所以这里的时候,它在时间叫你与像波纹管NO参数setSelected方法调用...

[couponCell 。radioButton setSelected:NO];

,所以当你在一次滚动表您的setSelected方法调用和你的按钮依次radio_blank.png ... :)