2

我已经为此苦苦挣扎了一个星期,我的头快要爆炸了。

基本上我使用 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 has working so far.....

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

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

4

1 回答 1

6

“即使数据数组为空,我如何才能显示不同颜色的单元格”

不要有一个空数组,有一个可变数组,其中所有成员最初都是空字符串,并在获得时将其替换为您的真实数据。

“一旦数据准备好,只更新一个单元格”

使用新数据更新您的数组,然后使用 reloadRowsAtIndexPaths:withRowAnimation: 更新表。如果您想逐行查看表更新(足够慢以查看),则先将数据放入临时数组中,然后使用 performSelector:withObject:afterDelay: 一次添加一个元素,调用 reloadRowsAtIndexPaths:withRowAnimation: after每次添加。

确切地说出你想要什么有点困难,但这里有一个例子来说明我的意思。该表显示 20 个空行,全部用不同的颜色显示 2 秒,然后以每秒 10 个的速率将 displayData 中的空字符串一一替换为 theData 中的字符串。

@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 具有与 theData 不同的行数时使其工作,则此版本的 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];
    }
}
于 2013-06-07T00:20:18.477 回答