0

我正在使用带有自定义单元格(xib)的 UITableView。每个单元格都是标签和一个复选框(UIButton)。

我在每个部分中有 2 个部分和 4 个单元格。如果我检查第一部分的第一个单元格,第二部分的第一个单元格也会被检查,我不想要。问题:dequeueReusableCellWithIdentifier:CellIdentifier。

我想保持我的单元格标识符静态。

我怎样才能解决这个问题 ?

这是我的数组的初始化(对于我的单元格的内容):

for(int i=0; i<NUMBER_OF_CELL; i++){

    Account *model = [[Account alloc]init];

    [model setAccountName:[NSString stringWithFormat:@"Account %d",i]];
    [model setAccountNumber:[NSString stringWithFormat:@"Number %d",i]];

    [_accountArray addObject:model];

}

设置内容:

[[cell accountLabel] setText:_model.accountName];
[[cell accountNumberLabel] setText:_model.accountNumber];

编辑:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    _model = [_accountArray objectAtIndex:indexPath.row];

    AccountCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"AccountCell" owner:self options:nil];
        cell = [topLevelObjects objectAtIndex:0];
    }
    // configure cell 
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    [[cell accountLabel] setText:_model.accountName];
    [[cell accountNumberLabel] setText:_model.accountNumber];
    // checkbox ? 

    if(cell.isChecked){

        NSLog(@"Checked");
    }else{
        NSLog(@"No checked");
    }

    return cell;
}

在另一堂课中,我检查复选框是否被选中:

- (IBAction)checkbox:(id)sender {

    NSIndexPath *indexPath = [(UITableView *)self.superview indexPathForCell: self];

    if(self.isChecked == NO)
    {
        self.isChecked = YES;
        [_checkbox setImage:[UIImage imageNamed:@"checkbox_checked.png"] forState:UIControlStateNormal];        
    }
    else{
        self.isChecked = NO;
        [_checkbox setImage:[UIImage imageNamed:@"checkbox.png"] forState:UIControlStateNormal];
    }

}

如何区分每个单元格以避免重复检查?

太感谢了!此致,

4

2 回答 2

1

您需要在 AccountCell.h/AccountCell.m 中编写以下方法

- (void)resetCell {

    //Reset Your cell content to default. So that you can reuse the cell.
    NSIndexPath *indexPath = [(UITableView *)self.superview indexPathForCell: self];


        self.isChecked = NO;
        [_checkbox setImage:[UIImage imageNamed:@"checkbox.png"] forState:UIControlStateNormal];

    //other resettings...
}

然后您可以从 (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 调用此方法,如下所示

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    _model = [_accountArray objectAtIndex:indexPath.row];

    AccountCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"AccountCell" owner:self options:nil];
        cell = [topLevelObjects objectAtIndex:0];
    }
    // configure cell 
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    //reset your cell's content.
    [cell resetCell];

    //perform your task below
    [[cell accountLabel] setText:_model.accountName];
    [[cell accountNumberLabel] setText:_model.accountNumber];
    // checkbox ? 

    if(cell.isChecked){

        NSLog(@"Checked");
    }else{
        NSLog(@"No checked");
    }

    return cell;
}

希望这可以帮助。

谢谢。

于 2013-03-19T15:01:00.187 回答
0

我认为你最好使用按钮的选定状态来跟踪它是否被选中。看起来您已经创建了一个“AccountCell”类,因此您应该能够简单地为 AccountCell 类中的复选框提供一个出口,例如:

@interface AccountCell : UITableViewCell
...
@property IBOutlet UIButton *checkBox;

现在,您可以在 AccountCell 的 viewDidLoad 方法中为按钮设置正常/检查图像(因为每次状态更改时都不需要这样做):

- (void)viewDidLoad
{
    [super viewDidLoad];
    [_checkBox setImage:[UIImage imageNamed:"checkbox.png" forState:UIControlStateNormal];
    [_checkBox setImage:[UIImage imageNamed:"checkbox_checked.png" forState:UIControlStateSelected];
}

在您的 cellForRowAtIndex 路径中,您可以使用以下方法确保为返回的单元格清除复选框:

cell.checkBox.selected = NO;

然后在复选框的“操作”代码中,您可以使用以下命令打开和关闭复选框:

self.selected = !self.selected;
于 2013-03-19T14:47:28.563 回答