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

C# 如何在MonoTouch的UITableView中重新加载数据?,c#,iphone,mono,xamarin.ios,C#,Iphone,Mono,Xamarin.ios,在我的应用程序中,我将在线web服务中的数据显示到多个UITableView中。我为用户添加了几种更新数据的方法,但是TableView.ReloadData()方法似乎不起作用。 当用户调用更新时,我从服务器获取一组新数据,将其传递给附加到UITableViewController的UITableViewSource实例,然后调用ReloadData()方法,不幸的是,该方法实际上没有重新加载数据。只有在返回到主屏幕,然后返回到表视图(因为它已经创建,所以我只显示已经存在的实例)之后,新数据才

在我的应用程序中,我将在线web服务中的数据显示到多个UITableView中。我为用户添加了几种更新数据的方法,但是TableView.ReloadData()方法似乎不起作用。 当用户调用更新时,我从服务器获取一组新数据,将其传递给附加到UITableViewController的UITableViewSource实例,然后调用ReloadData()方法,不幸的是,该方法实际上没有重新加载数据。只有在返回到主屏幕,然后返回到表视图(因为它已经创建,所以我只显示已经存在的实例)之后,新数据才会显示在表视图中。 我做错了什么?在更新数据时,我尝试创建UITableViewSource的新实例,但这也没有帮助

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

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

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

-

InvokeOnMainThread(delegate{
    Updates.TableView.Source = source;
    Updates.TableView.AllowsSelection = false;
    Updates.TableView.ReloadData();
});
将来,无论何时处理将更改当前显示的UI的事情,都需要确保它发生在主线程(也称为GUI线程)上。此InvokeOnMainThread是来自
NSObject
的方法,因此可以在所有
UIView
/
UIViewControllers
等中像上面一样调用-您也可以使用以下方法从完全C类调用它:

MonoTouch.UIKit.UIApplication.SharedApplication.InvokeOnMainThread(delegate{ /*code here*/ });

我也遇到了这个问题,发现了这个问题。使用这里的一些提示,我最终通过重置数据源并调用ReloadView()使其工作

根据我的测试,在InvokeOnMain线程中是否包装ReloadView()没有什么不同。嗯,那可能是因为我没有使用工作线程


奇怪的是,在另一种情况下,我可以通过在viewdidappease()中调用ReloadData()来刷新表视图。唯一的区别是,上面的情况是在同一视图中刷新。

您可以在
viewwillbeen()
中重新加载数据,或者在
viewwillbeen()中设置加载数据代码。
对于谷歌:

我也有同样的问题。这就是为我修好的

InvokeOnMainThread(delegate {
    myTableView.Source = new TableViewSource();
    myTableView.ReloadData();
    this.View.SetNeedsDisplay();
});

谢谢你的回复。我对此进行了测试,但没有任何区别。我试着把所有的代码放在GUI线程中,但这也不起作用。我检查了ReloadData()是否在没有互锁的情况下执行,它是否正常运行。是否可能需要使用其他方法以某种方式刷新表视图?也许会让它失效,然后强迫它在屏幕上重画?真奇怪。听起来确实像是刷新问题。这是一个延伸,但您是否尝试过
TableView.SetNeedsDisplay()也是吗?是的,我试过了,不幸的是没有任何结果。我已经阅读了MonoTouch文档,但是很多东西都没有文档记录。我可以尝试弹出到根视图控制器,然后按下重新加载的视图控制器,但首先这是一个可怕的黑客行为,我真的希望使用更好的解决方案,其次它可能会让用户感到困惑(因为弹出然后按下视图控制器需要一些时间)。谢谢你的帮助!这可能与您设置TableView源的方式有关。当您从该视图中弹出,然后将该视图推回,这将导致
viewwillbeen
被激发-在该方法中,您在这里做的有什么不同吗?p、 别担心,我对此很感兴趣!嗨,谢谢你的回复。我没有在视图中执行任何操作。我设置的源如下:“Updates.TableView.source=new-USource(一些参数);”在给TableView一个新的源/控制器/TableView之前,我已经尝试过处理TableView的源/控制器/TableView本身,但是没有任何区别。我会尝试手动调用viewwillbeen,看看这是否有效。
tableView.DataSource = new MyDataSource(...);
tableView.RelaodData();
InvokeOnMainThread(delegate {
    myTableView.Source = new TableViewSource();
    myTableView.ReloadData();
    this.View.SetNeedsDisplay();
});