gpt4 book ai didi

ios: UITableView reloadData 在滚动之前不工作

转载 作者:可可西里 更新时间:2023-11-01 06:06:57 24 4
gpt4 key购买 nike

我在 SO 上注意到了一些与此类似的问题,但它们似乎都以打电话的人结束

 [self.tableView reloadData]

在主线程之外。

我的问题是,我在主 UI 线程上调用它,但我仍然没有加载新行,直到我喜欢点击屏幕或稍微滚动一下。这就是我正在做的事情:当我进入我的 ViewController 时,表格会完整且正确地显示。在 View 上按下一个按钮后,我调用我的外部数据库并加载一些新行以添加到表中。将这些添加到我的数据源后,我调用 reloadData 并且所有新行都是空白的。仍然显示在屏幕上的几行已经是表格的一部分,但没有新内容。当我触摸屏幕或稍微滚动时,所有新单元格都会弹出。

这是我对服务器的调用结束后的代码:

     - (void)connectionDidFinishLoading:(NSURLConnection *)connection {

if(connection == self.searchConnection) {

..... some code ......

if(successful) {
// Adding new data to the datasource
[self.locations removeObjectAtIndex:[[NSNumber numberWithInt:self.locations.count - 1] integerValue]];
[self.cellTypeDictionary removeAllObjects];
for(int i = 0; i < [jsonLocations count]; ++i) {
NSDictionary *locationDictionary = jsonLocations[i];
BTRLocation *location = [BTRLocation parseLocationJSONObject:locationDictionary];
[self.locations addObject:location];
}


if(self.currentNextPageToken != nil && ![self.currentNextPageToken isEqual:[NSNull null]] && self.currentNextPageToken.length > 0) {
BTRLocation *fakeLocation = [[BTRLocation alloc] init];
[self.locations addObject:fakeLocation];
}

[self determineCellTypes];
if([self.locations count] < 1) {
self.emptyView.hidden = NO;
} else {
... some code .....

if(self.pendingSearchIsNextPageToken) {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[[NSNumber numberWithInt:countBefore] integerValue]

inSection:[[NSNumber numberWithInt:0] integerValue]];

dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
});
} else {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[[NSNumber numberWithInt:0] integerValue]
inSection:[[NSNumber numberWithInt:0] integerValue]];

dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
});
}
}
} else {
if(invalidAccessToken) {
// TODO: invalidAccessToken need to log out
}
}

你可以看到我什至添加了

  dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
});

即使我知道在主线程上调用了 connectionDidFinishLoading。但我想无论如何我都会尝试一下。

我看不出为什么这不起作用。

最佳答案

正确的做法是:

[self.tableView reloadData];
__weak MyViewController* weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
__strong MyViewController *strongSelf = weakSelf;
[strongSelf.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
});

有时我发现你在reloadData之后添加:

[self.tableView layoutIfNeeded];

关于ios: UITableView reloadData 在滚动之前不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26477231/

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