tableview中的可能错误

时间:2014-02-25 15:37:37

标签: ios uitableview

我有一个UITablViewController并实现以下内容:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

[self.tableView cellForRowAtIndexPath:self.oldIndexPath].accessoryType = UITableViewCellAccessoryNone;

NSLog(@"%@", indexPath);
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

cell.accessoryType = UITableViewCellAccessoryCheckmark;
self.oldIndexPath = indexPath;
}

我注意到,复选标记出现在2个单元格上,一个带有索引路径,例如,如果我选择索引路径为{length = 2, path = 0 - 2}的单元格并向下滚动,我会注意到复选标记在{{1 }}

表格视图中只有1个部分,大约18-19行。

有人可以为我验证这个/或者是时候睡觉了吗?/?

P.S:在模拟器和设备上测试了这个

细胞创建如下:

{length = 2, path = 0 - 14}

2 个答案:

答案 0 :(得分:2)

由于您的单元格是可重用的(我想),您需要在

中设置它
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [self.tableView cellForRowAtIndexPath:self.oldIndexPath].accessoryType = UITableViewCellAccessoryNone;

    NSLog(@"%@", indexPath);

    self.oldIndexPath = indexPath;
    for (UITableViewCell *cell in tableView.visibleCells) {
        if ([tableView indexPathForCell:cell].section == indexPath.section && [tableView indexPathForCell:cell].row == indexPath.row) {
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        }
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    // Configure the cell... 
    cell.textLabel.text = self.stationsDictionary[@"urls"][indexPath.row][@"title"]; return cell;
    cell.accessoryType = self.oldIndexPath.section == indexPath.section && self.oldIndexPath.row == indexPath.row ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
}

或者重用的单元格将保持可以检查的前一个单元格(重用的单元格)的状态。

常见错误;)

答案 1 :(得分:1)

当您从cellForRowAtIndexPath出列单元格时,请务必重置其状态 - 在您的情况下,为accessoryType属性。

由于单元格被重用,所以会发生当索引为2的单元格不可见时,会重复使用它来显示索引为14的行。

因此,如果要保留其状态,则需要保存每个单元格状态(如果只需要保存didSelectRowAtIndexPath属性,则需要在accessoryType中保存),并恢复进入cellForRowAtIndexPath的单元格。 您可以使用NSArray,使用单元格索引作为数组索引来保存单元格状态,甚至是UITableViewCellAccessoryType或布尔值的“普通”数组