在重新排序或删除行时更新交替的彩色UITableViewCell

时间:2009-08-23 22:10:48

标签: iphone uitableview

我有一个带有交替颜色的UITableViewCells的UITableView。并且可以编辑表:可以重新排序和删除行。当行被重新排序或删除时,如何更新交替背景颜色的单元格?

我用这个来绘制交替的彩色细胞:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if ([indexPath row] % 2) {
        // even row
        cell.backgroundColor = evenColor;
    } else {
        // odd row
        cell.backgroundColor = oddColor;
    }
}

但是当重新排序或删除行时,不会调用此方法。而且我无法通过以下方法调用[tableView reloadData],因为它会在无限循环中崩溃应用程序:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
    // Move the object in the array
    id object = [[self.list objectAtIndex:[fromIndexPath row]] retain];
    [self.list removeObjectAtIndex:[fromIndexPath row]];
    [self.list insertObject:object atIndex:[toIndexPath row]];
    [object release];

    // Update the table ???
    [tableView reloadData]; // Crashes the app in an infinite loop!! 
}

是否有人有指针或最佳实践解决方案来处理重新排列交替着色单元格的问题?

由于

7 个答案:

答案 0 :(得分:5)

如果您无法使用该方法调用,则使用延迟调用来执行重新加载:

[tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.0f];

等待当前方法完成后再调用reload。

答案 1 :(得分:4)

无需使用第三方对象或重新加载/刷新整个dataSource。只需在瑞士刀中使用正确的工具:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if(editingStyle == UITableViewCellEditingStyleDelete) {
        //1. remove your object
        [dataSource removeObjectAtIndex:indexPath.row];

        //2. update your UI accordingly
        [self.myTableView beginUpdates];
        [self.myTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
        [self.myTableView endUpdates];

        //3. obtain the whole cells (ie. the visible ones) influenced by changes
        NSArray *cellsNeedsUpdate = [myTableView visibleCells];
        NSMutableArray *indexPaths = [[NSMutableArray alloc] init];
        for(UITableViewCell *aCell in cellsNeedsUpdate) {
            [indexPaths addObject:[myTableView indexPathForCell:aCell]];
        }

        //4. ask your tableview to reload them (and only them)
        [self.myTableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];

    }
}

答案 2 :(得分:3)

重新加载太重了;我写了AltTableViewController只是改变了单元格的背景颜色,它应该更快。

答案 3 :(得分:1)

我从tableview中获取了所有UITableViewCell子视图,并根据单元格frame.origin.y对该数组进行了排序,以便它们以正确的顺序返回。然后我根据索引== 0 ||改变背景颜色index%2 == 0重新着色它们。似乎比重新加载tableView更好用,因为这会导致动画抖动。上午1:25为我工作

答案 4 :(得分:0)

[tableView reloadData]会让你的桌面背景回归。您的另一个选择是将所有可见单元格的背景颜色从移动中较低索引的indexPath交换到visibleCells中的最高值。

答案 5 :(得分:0)

这很好用。在最后一个索引而不是第一个索引处启动模式。这样每个单元格总是保留它的背景:

    if (dataSource.count - indexPath.row) % 2 == 0 {
        cell.backgroundColor = UIColor.grayColor()
    } else {
        cell.backgroundColor = UIColor.whiteColor()
    }

我尝试了其他解决方案,但并不完全满意。这个解决方案不是黑客,甚至不能添加另一行代码。

答案 6 :(得分:0)

如果您使用的是swift和NSFetchedResultsController:

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {

    tableView.endUpdates()

    //for the alternate colours
    self.tableView.reloadRows(at: tableView.indexPathsForVisibleRows!, with: .fade)
}