iOS:逐行添加/更新UITableView单元格

Unh*_*lig 2 uitableview ios

我一直在努力奋斗一个星期,我的头脑即将爆炸.

基本上我使用Prototype Cell,在CellWillAppear中我做了一些像背景颜色的自定义.没有什么花哨.

因此,我的表视图在启动时始终为空(无单元格),除非数组(数据源)填充了某些内容.所以我做的是在NumberOfRowsInSection中:

return dataArray.count < 10? 10 : dataArray.count

我这样做是因为我希望在没有数据时至少看到一些空单元格.这意味着它将在启动时显示至少10个空单元格.

为了向单元格添加数据,我每次都在tableviewcontroller中调用委托方法在数据数组中添加一个单独的实体(这样做,因为我认为它比等待整个数组填充然后调用更快[self.tableView reloadData];)然后使用reloadRowsAtIndexPaths刷新它.但是当它到达索引10时它每次崩溃(错误:......在更新数据数量为10之前,但在更新之后是11).

我真正想要的是:

1.)准备一些数据

2.)将它发送到uitableview控制器并将其添加到那里的数组,而不是等待,然后将整个数组发送到表视图并立即刷新.

3.)在更新后重新加载一行(而不是使用reloadData - >因为我有不同颜色的单元格,整个重新加载的东西导致我的表视图闪烁疯狂).

我正在对细胞定制做的一件事是在willDisplayCell中:我做的是改变细胞的背景颜色.再一次,没什么特别的.但由于启动时没有数据,所以没有任何单元格可见(ui tablew根本没有显示单元格),除非我这样做

return dataArray.count < 10? 10 : dataArray.count;

只是这样,至少有10个空单元格显示(为什么我必须执行上述操作才能显示一些自定义的空单元格...").

使用reloadData是没有问题的刷新,但由于每次数据准备就在表视图中更新数据源数组而不是将所有准备好的数据保存到此数组并通过使用reloadData将其发送到表视图进行更新,我希望逐行更新.

我觉得错误来自这样一个事实:如果我在数组中添加一个项目,然后调用reloadRowsAtIndexPath,它会说"好的,你之前有一个项目,但更新后有2个!不一致......"

我已经尝试过使用[tableView beginUpdate]; and [tableView endUpdate]; Nothing工作到目前为止.....

总结一下:即使数据阵列在启动时为空,我怎样才能显示不同颜色的单元格(就像默认的ui表视图,单元格完全显示甚至没有数据)并且只更新一个单元格一次准备好一块数据而不是用reloadData更新整个ui表视图?

非常感谢,请指教.问候.

rde*_*mar 6

"即使数据数组为空,我怎样才能显示不同颜色的单元格"

没有一个空数组,有一个可变数组,其中所有成员最初都是空字符串,并在获得它时用实际数据替换它们.

"一旦数据准备就绪,只更新其中一个单元格"

使用新数据更新数组,然后使用reloadRowsAtIndexPaths:withRowAnimation:更新表.如果你想逐行查看表更新(慢到可以看到),那么先将数据放入临时数组,然后使用performSelector:withObject:afterDelay:一次添加一个元素,调用reloadRowsAtIndexPaths:withRowAnimation:after每增加一个.

要说出你想要的东西有点难,但这里有一个我的意思的例子.此表显示20个空行,所有行都有不同的颜色,持续2秒,然后它将dataData中的空字符串逐个替换为每秒10的速率.

@interface TableController ()
@property (strong,nonatomic) NSArray *theData;
@property (strong,nonatomic) NSMutableArray *displayData;
@end

@implementation TableController 


- (void)viewDidLoad {
    [super viewDidLoad];
    self.displayData = [@[@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@""] mutableCopy];
    self.theData = @[@"One",@"Two",@"Three",@"Four",@"Five",@"Six",@"Seven",@"Eight",@"Nine",@"ten",@"Black",@"Brown",@"Red",@"Orange",@"Yellow",@"Green",@"Blue",@"Violet",@"Gray",@"White"];
    [self.tableView reloadData];
    [self performSelector:@selector(addData) withObject:nil afterDelay:2];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.displayData.count;
}

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    UIColor *cellTint = [UIColor colorWithHue:indexPath.row * .05 saturation:1.0 brightness:1.0 alpha:1.0];
    cell.backgroundColor = cellTint;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = self.displayData[indexPath.row];
    return cell;
}

-(void)addData {
    static int i = 0;
    [self.displayData replaceObjectAtIndex:i withObject:self.theData[i]];
    [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
    i++;
    if (i < self.displayData.count) [self performSelector:@selector(addData) withObject:nil afterDelay:.1];
}
Run Code Online (Sandbox Code Playgroud)

如果您不希望行更新之间有任何延迟,并且您希望在displayArray具有与Data不同的行数时使其工作,则此版本的addData应该可以工作:

-(void)addData {
    static int i = 0;
    if (i < self.displayData.count && i< self.theData.count) {
        [self.displayData replaceObjectAtIndex:i withObject:self.theData[i]];
        [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
        i++;
        [self addData];
    }else if (i >= self.displayData.count && i< self.theData.count) {
        [self.displayData addObject:self.theData[i]];
        [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
        i++;
        [self addData];
    }
}
Run Code Online (Sandbox Code Playgroud)