UITableView 在重新加载数据后不会立即显示单元格

Posted

技术标签:

【中文标题】UITableView 在重新加载数据后不会立即显示单元格【英文标题】:UITableView does not display cell immediately after reloading data 【发布时间】:2014-04-29 02:17:19 【问题描述】:

在viewDidload中,tableview从服务器加载数据

success:^(NSArray *array) 
    if (!_dataSource) 
        _dataSource = [@[] mutableCopy];
    
    if (array) 
        [_dataSource addObjectsFromArray:array];
        [_tableView reloadData];
    

然后每次我从底部拉起时,从服务器获取新数据并将其附加到 _dataSource(与第一次相同)

success:^(NSArray *array) 
    if (!_dataSource) 
        _dataSource = [@[] mutableCopy];
    
    if (array) 
        [_dataSource addObjectsFromArray:array];
        [_tableView reloadData];
    

现在问题来了:有时从底部拉起,成功获取新数据,但是tableview不会立即显示新单元格,当我扫描tableview时(即使只是触摸屏幕)新的显示单元格。 可能是什么问题?

编辑

因为每个单元格的高度不一样,所以我没有重用单元格,每次都初始化一个新的单元格,是这个原因吗?

//    TopicCell *cell = [tableView dequeueReusableCellWithIdentifier:TopicCellIdentifier];
//    if(!cell)    
//        cell = [[TopicCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TopicCellIdentifier];
//    
TopicCell *cell = [[TopicCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TopicCellIdentifier];

@Jeffery Thomas,成功只是像这样的 AFNetworking 块

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
 [manager GET:path
          parameters:parameters
             success:^(AFHTTPRequestOperation *operation1, id responseObject) 

             
             failure:^(AFHTTPRequestOperation *operation2, NSError *error) 

             ];

【问题讨论】:

你在 mainThread 中重新加载数据? @nmh 当然[_tableView reloadData]; 在主线程中。 如果您发布更多背景信息会很有帮助。包含success:的方法是什么? @JefferyThomas 谢谢,请查看附加消息。 您的 AFNetworking 调用的上下文是什么? scrollViewDidScroll:? 【参考方案1】:

作为第一个猜测,我会确保您在主线程(队列)上运行-reloadData。这很简单。

success:^(NSArray *array) 
    dispatch_async(dispatch_get_main_queue(), ^
        if (!_dataSource) 
            _dataSource = [@[] mutableCopy];
        
        if (array) 
            [_dataSource addObjectsFromArray:array];
            [_tableView reloadData];
        
    );

【讨论】:

【参考方案2】:

您是否尝试将 _dataSource 设置为块变量,因为您正在更新块内的实例变量?还要确保在主线程中重新加载数据。

编辑

你做过类似的事情

    __block YourViewController *this = self;

//Inside block
    if (!this.dataSource) 
        this.dataSource = [@[] mutableCopy];
    
    if (array) 
        [this.dataSource addObjectsFromArray:array];
        [this.tableView reloadData];
    

【讨论】:

谢谢,我改成__block了,问题依旧存在。【参考方案3】:

我的错误:

我为 _dataSorce 制作了错误的页面信息,例如 第一次从服务器加载 20 个 NSObjects,_dataSource is [0:19] 第二次从服务器加载 20 个 NSObjects,_dataSource should be [0:39],我错了[20:59] 无论如何,如果_dataSource 的索引正确,则不会显示此有线问题。

【讨论】:

以上是关于UITableView 在重新加载数据后不会立即显示单元格的主要内容,如果未能解决你的问题,请参考以下文章

数据源与后台 NSManagedObjectContext 合并后 UITableView 不会重新加载

UITableView 在使用 Swift 中的 Master Detail App 滚动之前不会重新加载

当我动态更改其框架时,即使重新加载后 UITableView 内容大小也不会更新

从另一个类重新加载 iPhone 上的 TableView

嵌入在 UIStackView 中的 UITableView 不会重新加载数据

重新加载 uitableview 从第二行开始(或不在第一行)