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)
你说是在不同的线程中完成的,难道工作线程不能调用UI线程吗?也就是说,您应该通过委托调用 ReloadData,以确保它在 UI 线程中被调用,而不是“仅”在工作线程中,因为它可能会互锁并且永远不会被实际调用(在不同的场景中发生在我身上)。
| 归档时间: |
|
| 查看次数: |
11411 次 |
| 最近记录: |