reloadRowsAtIndexPaths导致更改背景图像的问题

时间:2013-01-25 00:25:18

标签: ios objective-c xcode uitableview

我在右侧滑动时在UITableViewCell上切换背景图像。问题是,如果我添加[taskManager reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];,它只会切换一次,但不会切换回来。那么为什么呢?什么会导致这种情况发生?这是整个方法代码。

- (void)handleSwipeRight:(UISwipeGestureRecognizer *)gestureRecognizer {
CGPoint location = [gestureRecognizer locationInView:self.taskManager];

NSIndexPath *indexPath = [self.taskManager indexPathForRowAtPoint:location];

[taskManager reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];

UIImage *notCkDone = [UIImage imageNamed:@"UITableViewCellCheckmark"];
UIImage *isCkDone = [UIImage imageNamed:@"UITableViewCellCheckmarkDone"];

UIImage *notBgDone = [UIImage imageNamed:@"UITableViewCell"];
UIImage *isBgDone = [UIImage imageNamed:@"UITableViewCellDone"];

UITableViewCell *cell = [taskManager cellForRowAtIndexPath:indexPath];

if (indexPath) {
    if (cell.imageView.image == notCkDone) {
        cell.imageView.image = isCkDone;
        cell.backgroundView = [[UIImageView alloc] initWithImage:isBgDone];
    } else {
        cell.imageView.image = notCkDone;
        cell.backgroundView = [[UIImageView alloc] initWithImage:notBgDone];
    }
    cell.textLabel.textColor = [UIColor colorWithRed:0.0/0.0 green:0.0/0.0 blue:0.0/0.0 alpha:1.0];
}

}

1 个答案:

答案 0 :(得分:3)

您的单元格视觉效果的所有更改都应在tableView:cellForRowAtIndexPath:内进行。您不应该在手势识别器的事件处理程序中(或tableView:cellForRowAtIndexPath之外的任何其他位置)执行此操作。

手势识别器需要更改表视图后面的模型,以便tableView:cellForRowAtIndexPath可以决定将图像设置为notCkDoneisCkDone下次重新加载数据,并处理后台更改。然后你的手势识别器应该告诉表视图重新加载数据。

您当前的解决方案适用于tableView:cellForRowAtIndexPath返回的单元格。从外部更改视觉效果时,表格视图显示单元格在屏幕上时的更改。但是,当单元格滚动离开屏幕时,它会回收,这意味着下次使用单元格标识符将单元格出列时,您可能会获得一个用于显示为不同单元格的对象。