gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:17:53 25 4
gpt4 key购买 nike

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

基本上我使用 Prototype Cell,在 CellWillAppear 中我做了一些定制,比如背景颜色。没有什么花哨。

因此,我的 TableView 在启动时总是空的(没有单元格),除非数组(数据源)被填充了一些东西。所以我所做的是在 NumberOfRowsInSection 中:

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

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

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

我真正想要的是:

1.) 准备一些数据

2.) 将它发送到 uitableview Controller 并将其添加到那里的数组,而不是等待然后将整个数组发送到 TableView 并立即刷新。

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

我对单元格自定义所做的一件事是在 willDisplayCell 中:我在那里所做的是改变单元格的背景颜色。再一次,没什么特别的。但是因为启动时没有数据,所以没有单元格是可见的(ui tablew 根本没有显示单元格),除非我这样做

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

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

使用reloadData是刷新没问题,但是由于我是在每次数据准备好时更新 TableView 中的数据源数组,而不是将所有准备好的数据保存到这个数组中,然后将其发送到 TableView 中使用reloadData进行更新,我想逐行更新。

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

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

所以总结一下:即使数据数组在启动时为空,我如何才能显示不同颜色的单元格(就像默认的 ui TableView ,即使没有数据也完全显示单元格)并仅更新其中一个一条数据准备好后的单元格,而不是使用 reloadData 更新整个 ui TableView ?

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

最佳答案

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

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

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

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

很难准确地说出您想要什么,但这里有一个例子可以说明我的意思。此表显示 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];
}
}

关于iOS:逐行添加/更新 UITableView 单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16972948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com