“即使数据数组为空,我如何才能显示不同颜色的单元格”
不要有一个空数组,有一个可变数组,其中所有成员最初都是空字符串,并在获得时将其替换为您的真实数据。
“一旦数据准备好,只更新一个单元格”
使用新数据更新您的数组,然后使用 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];
}
}