Iphone 更新数据异步后重新绘制UITableView

Iphone 更新数据异步后重新绘制UITableView,iphone,uitableview,xamarin.ios,Iphone,Uitableview,Xamarin.ios,我有一个UITableview,我使用数据异步加载,因此tableview可能会在没有数据的情况下显示。 我已经厌倦了ReloadData方法,但是tableview仍然是空的,直到我滚动tableview,数据突然出现。 当我将tableview加载为detailedview并在项目之间切换时,也会发生同样的情况,previoud items数据会首先出现,当我在table view中滚动时,它会显示正确的数据。 我猜ReloadData方法可以很好地工作,但是我需要以某种方式重新绘制tabl

我有一个UITableview,我使用数据异步加载,因此tableview可能会在没有数据的情况下显示。
我已经厌倦了ReloadData方法,但是tableview仍然是空的,直到我滚动tableview,数据突然出现。
当我将tableview加载为detailedview并在项目之间切换时,也会发生同样的情况,previoud items数据会首先出现,当我在table view中滚动时,它会显示正确的数据。
我猜ReloadData方法可以很好地工作,但是我需要以某种方式重新绘制tableview,关于如何解决这个问题有什么建议吗


/吉米

我想它没有重新加载

当您将单元格滚动到屏幕外时,则

tableView:cellForRowAtIndexPath:

…将被调用。因此它将被重新加载

我猜UITableView变量未经验证

如果使用UITableView作为主视图,可以尝试此操作

[self.view重载数据]


[self.tableView重载数据]

您说过要异步填充内容,但您是否在主线程的上下文中调用了重载数据?(而不是通过填充内容的线程)

目标-C

[yourUITableView performSelectorOnMainThread:@selector(reloadData)
                                  withObject:nil 
                               waitUntilDone:NO];
Swift

dispatch_async(dispatch_get_main_queue(), { self.tableView.reloadData() })
Monotouch

InvokeOnMainThread(() => this.TableView.ReloadData());

当用户当前可以看到您的视图时(例如:用户按下重新加载按钮填充您的
UITableView
),Yonels的回答是完美的

但是,如果您的数据是异步加载的,并且您的
UITableView
在更新过程中不可见(例如:您在另一个视图中将数据添加到
UITableView
,并且
UITableView
稍后由用户输入显示),只需覆盖
UITableViewController
视图将出现
方法

- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.tableView reloadData];
}

积极的效果是,您的
UITableView
仅在用户真正希望看到它时重新加载一次数据,而不是在添加新项目时。

我今天遇到了类似的问题(iOS 7.0中的情节提要)。 我在UIViewController中使用表视图。加载视图时,一切都正常工作;所有的代表都被叫来了;当底层数据源(在我的例子中是数组)被修改时;未更新可见表行。它们已更新;只有当我滚动表格视图时

尝试了一切;在主线程上调用重载数据;调用视图中的重新加载将出现;什么都没用

我发现的问题;是因为我没有在故事板上建立联系;对于具有引用出口的表视图。虽然设置了数据源和委托。 我不认为这是个问题;因为一开始一切都很顺利


希望它能帮助到别人。我花了很长时间才发现这一点。

在有点天真地复制了yonel的解决方案并称之为好之后,我意识到调用
performSelectorOnMainThread:withObject:waitUntilDone:
修复了症状,但没有解决问题。更大的问题是,您仍然在异步线程或后台线程的上下文中进行UI更新

这就是我的代码的样子:

dispatch_queue_t queue = dispatch_queue_create("com.kyleclegg.myqueue", NULL);
dispatch_async(queue, ^{

  // Make API call
  // Retrieve data, parse JSON, update local properties
  // Make a call to reload table data

});
当它看起来像这样时:

dispatch_queue_t queue = dispatch_queue_create("com.kyleclegg.myqueue", NULL);
dispatch_async(queue, ^{

  // Make API call
  // Retrieve data, parse JSON, update local properties

  dispatch_async(dispatch_get_main_queue(), ^{
    // Now make the call to reload data and make any other UI updates
    [self.tableView reloadData]
  });

});
如果您只需要调用
[self.tableView reloadData]
就可以使用
performSelectorOnMainThread:withObject:waitUntilDone:
,因为它实现了相同的目标,但是您还应该认识到全局中发生了什么。此外,如果您要做的UI工作比重新加载表要多,那么所有这些代码也应该放在主队列中


参考:使用GCD和管理后台与主线程。

Swift 4:

DispatchQueue.main.async { self.tableView.reloadData() }

通常,reloadData方法刷新tableview的视图。你能把你的TableViewController代码的示例放进去吗?谢谢你解决了它=)monotouch的解决方案是:InvokeOnMainThread(()=>this.TableView.ReloadData())@yonel我和JimmyEngtröm有同样的问题,我真的希望你所说的能够做到,但唉,我仍然有这个问题。更新UITableView所使用的底层数据数组后,我找不到刷新UITableView的方法。@MasonG.Zhwiti:在表数据源中的numberOfRowsInSections方法中设置断点,并检查它是否在重新加载数据后进入。然后检查您在此处返回的行数,如果不是0,则它将调用CellForRowatinex。在我看来,这是一种解决方法,因为真正的问题是您可能不应该在后台线程上进行任何UI更新。我添加了另一个解释如下的答案。要在swift中实现这一点,请使用
dispatch\u async(dispatch\u get\u main\u queue(),{self.tableView.reloadData()})