如何在MonoTouch中的UITableView中重新加载数据?

Kir*_*ril 8 c# iphone mono xamarin.ios

在我的应用程序中,我将来自在线Web服务的数据显示到几个UITableViews中.我已经为用户添加了几种更新数据的方法,但TableView.ReloadData()方法似乎不起作用.当用户调用更新时,我从服务器获取一组新数据,将其传递给附加到UITableViewController的UITableViewSource实例,然后调用ReloadData()方法,但实际上并不重新加载数据.只有在我返回到主屏幕然后返回到表视图(因为它已经创建,我只显示已存在的实例)之后,新数据才会显示在tableview中.我究竟做错了什么?我在更新数据时尝试创建UITableViewSource的新实例,但这也无济于事.

以下是将数据加载到tableview中的代码(我将其重用于需要将数据加载到其中的任何事件):

 dataControl.GetList(Tables.UPDATES)); //gets data from the server and passes it to the SQL database
 Source source = GetSource(theType.Name, theType, groups); //creates a new source loaded with the data
 Updates.TableView.Source = source;
 Updates.TableView.AllowsSelection = false;     
 Updates.TableView.ReloadData();
Run Code Online (Sandbox Code Playgroud)

这个代码当然是在一个在主线程上调用的独立线程中执行的.基本上,当用户请求更新时调用相同的代码(在后台线程工作时播放动画).

Luk*_*uke 13

Pavel是正确的 - 尝试以下操作来查看它是否有效:

InvokeOnMainThread(delegate{
    Updates.TableView.Source = source;
    Updates.TableView.AllowsSelection = false;
    Updates.TableView.ReloadData();
});
Run Code Online (Sandbox Code Playgroud)

将来,无论何时处理将改变当前显示的UI的内容,您都需要确保它发生在主线程(也称为GUI线程)上.这个InvokeOnMainThread是一个方法,NSObject因此可以在所有UIViews/ UIViewControllersetc中像上面一样调用 - 你也可以使用以下命令从完全C#类调用它:

MonoTouch.UIKit.UIApplication.SharedApplication.InvokeOnMainThread(delegate{ /*code here*/ });
Run Code Online (Sandbox Code Playgroud)


Pav*_*ich 3

你说是在不同的线程中完成的,难道工作线程不能调用UI线程吗?也就是说,您应该通过委托调用 ReloadData,以确保它在 UI 线程中被调用,而不是“仅”在工作线程中,因为它可能会互锁并且永远不会被实际调用(在不同的场景中发生在我身上)。