reloadRowsAtIndexPaths的副作用?

时间:2015-05-20 12:30:34

标签: ios uitableview cocoa-touch uikit

我有一个UITableView,其中包含UITableViewCell,其中包含一个复选标记。

enter image description here

当我点击一个单元格时,如果它被标记,则它变为无标记,反之亦然。

enter image description here

到目前为止一切顺利。现在我想每次点击任何其他单元格时更新第一个单元格(假设第一个单元格是特殊的)。我修改了didSelectRowAtIndexPath的代码(见下文)并且它正常工作,除了我在单击的单元格上出现以下不良行为:

enter image description here

正如你所看到的那样,细胞顶部的白线消失了......

以下是我的代码对于(我猜)关键函数的看法:

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.backgroundColor = [UIColor darkGrayColor];
    cell.textLabel.textColor = [UIColor whiteColor];
    cell.textLabel.text = [myLabels objectAtIndex:indexPath.row];
    bool isChecked = false;
    if ([currentValues[indexPath.row] boolValue]) {
        isChecked = true;
    }
    cell.accessoryType =  isChecked ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
    return cell;
}


- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    bool isChecked = false;
    if ([currentValues[indexPath.row] boolValue]) {
        isChecked = false;
        currentValues[indexPath.row] = [NSInteger numberWithBool:false];

        // below is the part of code that causes trouble

        [self.tableView beginUpdates];
        NSIndexPath* indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates];

        // end of problematic code
    }

    else {
        isChecked = true;
        currentValues[indexPath.row] = [NSInteger numberWithBool:true];
        // similarly...
        [self.tableView beginUpdates];
        NSIndexPath* indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates];
    } 
    cell.accessoryType = isChecked ? UITableViewCellAccessoryCheckmark :UITableViewCellAccessoryNone;
}

NB 如果我重新加载整个表格,那么我就没有这个问题。但是我觉得可能值得我理解那里发生的事情。

NB2 我尝试使用和不使用[self.tableView beginUpdates]和[self.tableView endUpdates]的调用,但它似乎没有什么区别。

1 个答案:

答案 0 :(得分:0)

didSelectRowAtIndexPath会稍微改变一下,

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    bool isChecked = false;
    if ([currentValues[indexPath.row] boolValue]) {
        isChecked = false;
        currentValues[indexPath.row] = [NSInteger numberWithBool:false];

        // below is the part of code that causes trouble
        [self.tableView deselectRowAtIndexPath:indexPath animated:NO]; 
        //MYCHANGES
        [self.tableView beginUpdates];
        NSIndexPath* indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates];

        // end of problematic code
    }

    else {
        isChecked = true;
        currentValues[indexPath.row] = [NSInteger numberWithBool:true];
        // similarly...
        [self.tableView deselectRowAtIndexPath:indexPath animated:NO]; 
        //MYCHANGES
        [self.tableView beginUpdates];
        NSIndexPath* indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates];
    } 
    cell.accessoryType = isChecked ? UITableViewCellAccessoryCheckmark :UITableViewCellAccessoryNone;
}