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

时间:2013-06-06 22:01:21

标签: ios uitableview

我一直在为此奋斗一个星期,我的脑袋即将爆炸。

基本上我使用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 - &gt;因为我有不同颜色的单元格,整个重新加载的东西导致我的表视图闪烁疯狂)。

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

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

这样至少有10个空单元显示(为什么我只需要显示一些自定义的空单元格就可以了...)。

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

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

我已尝试使用[tableView beginUpdate]; and [tableView endUpdate]; 到目前为止没有任何工作.....

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

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

1 个答案:

答案 0 :(得分: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];
}

如果您不希望行更新之间有任何延迟,并且您希望在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];
    }
}