滚动会在UITableView中混乱自定义单元格

时间:2011-11-29 13:32:14

标签: objective-c ipad uitableview scroll

我正在开发一个具有自定义UITableView的{​​{1}}的应用程序。单元格包含复选框和3个标签。用户可以通过单击复选框选择多行。当我选择多行并滚动表格视图时,复选标记将从复选框中消失。这意味着所选行将更改为未选择的模式。如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我认为您的问题可能与细胞重用有关。在控制器中创建一个NSMutableDictionary(应该是和实例变量),并按如下方式创建它:

dictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
                 [NSNumber numberWithBool:NO], [NSIndexPath indexPathForRow:0 inSection:0],
                 [NSNumber numberWithBool:NO], [NSIndexPath indexPathForRow:1 inSection:0], nil];

对所有行执行此操作,或者根据需要计算行及其索引,但将所有对象设置为[NSNumber numberWithBool:NO

现在,在tableView:didSelectRowAtIndexPath:

if ([(NSNumber *)[dictionary objectForKey:indexPath] isEqualToNumber:[NSNumber numberWithBool:NO]) {
    [dictionary setObject:[NSNumber numberWithBool:YES] forKey:indexPath];
    // Do any visual updating necessary
} else {
    [dictionary setObject:[NSNumber numberWithBool:NO] forKey:indexPath];
    // Do any visual updating necessary
}

既然我们有办法存储是否选择了一个单元格,请更改您的单元格标识符以适用于您的单元格:

NSString *identifier = [[dictionary objectForKey:indexPath] stringValue];
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier] autorelease];
}

// Do any visual updating necessary
return cell;

现在,更新自定义单元格类以接受@"0"@"1"作为标识符,并根据此输入自动更新其选定状态。

答案 1 :(得分:0)

我猜这是因为细胞正在重复使用。这意味着当单元格滚动回视图时会调用cellForRowAtIndex :.并且复选框默认为未选择的模式。将复选框的状态存储在一个数组中,并按照

设置单元格的复选框状态