我正在使用带有自定义单元格(xib)的UITableView。每个单元格都是标签和复选框(UIButton)。
我在每个部分有2个部分和4个单元格。如果我检查第一部分的第一个单元格,第二部分的forst单元格也将被检查,我不想要。问题: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];
}
}
如何区分每个细胞以避免重复检查?
非常感谢你! 最好的问候,
答案 0 :(得分: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;
}
希望这有帮助。
感谢。
答案 1 :(得分: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;