重新加载 UITableView 数据而不是可见单元格

Posted

技术标签:

【中文标题】重新加载 UITableView 数据而不是可见单元格【英文标题】:Reload UITableView data and not the visible cells 【发布时间】:2012-10-14 17:59:29 【问题描述】:

我正在开发一个应用程序,我想从远程 Web 服务中提取数据并填充 UITableView。当我获得新数据时,我希望保留当前可见的单元格并在其上方添加新数据,就像大多数 Twitter 客户端一样。我的加载方法目前如下所示:

- (void)loadPostsInBackground

    NSURL *url = [NSURL URLWithString:@"[URL]"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    AFJSONRequestOperation *operation;
    operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id jsonObject) 

        [self createPostsFromDict:jsonObject];
        [self.refreshControl endRefreshing];
        [self.tableView reloadData];

     failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id jsonObject) 

        NSLog(@"Received an HTTP %d", response.statusCode);
        NSLog(@"The error was: %@", error);

    ];

    [operation start];


这可行,但它会使用新数据更新当前可见的单元格。所以我想要的是,获取新数据,将其添加到当前可见的单元格上方(或留在当前可见的单元格)。最好的方法是什么?

注意:我需要 ios6。

【问题讨论】:

你还在用fetchedResultsController吗?我不确定这是否可以满足您的要求。 createPostsFromDict 是否会重新调整可以用来填充表的数组? 是的,还在使用。通过将新帖子的数量添加到实例变量中,然后在加载新行后滚动到该行而不使用动画来使其工作。但它并不完美或漂亮,但它确实有效。 createPostsFromDict 不返回数组,它只是将帖子添加到我的 managedObjectContext。 【参考方案1】:

而不是在表格视图上调用 reloadData。您应该调用 insertRowsAtIndexPaths:withRowAnimation:。在更新表格视图的数据源使用的数据后执行此操作。

【讨论】:

谢谢,我在 numberOfSections 和 numberOfRows 中都使用了 NSFetchResultController,我不完全确定应该如何正确更新它。我在insertRowsAtIndexPaths:withRowAnimation 之前尝试过NSError *error [self.fetchedResultsController performFetch:&error];,但没有成功。继续获取:Invalid update: invalid number of rows in section 0... 您之前为更新数据模型所做的工作应该可以工作。您真正需要的唯一更改是更新表格的方式。当您调用 insertRows... 方法时,将调用所有数据源方法。只要他们返回正确的数字就可以了。 好的,我删除了reloadData 并将其更改为NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; NSArray *indexArray = [NSArray arrayWithObjects:indexPath, nil]; [self.tableView insertRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationRight];,但我得到了同样的错误。 该代码假定您只添加 1 行。对吗?如果您的数据源已更新为 0 行或多于 1 行,那么您将收到该错误。我不熟悉您如何更新数据结构,但它们需要使用您尝试插入的相同数量的行进行更新。 好的,我明白了,不,它可能是多行。对 insertRowsAtIndexPaths 不是很熟悉。那么,是否有可能让它更动态,因为我不知道它会有多少行。

以上是关于重新加载 UITableView 数据而不是可见单元格的主要内容,如果未能解决你的问题,请参考以下文章

重新加载 UITableView 数据而不重新加载视图?

在搜索期间重新加载 UITableView

从另一个类重新加载 UITableView?

如何在我查看 UITableView 时重新加载它

在表格视图中重新加载数据而不损害动画

UITableView reloadData在iOS 11中重新出现时崩溃