MonoTouch - 异步UISearchBar

时间:2012-01-05 05:16:35

标签: c# ios asynchronous xamarin.ios uisearchbar

我有一个异步的UISearchBar设置如下:

  • 继承UISearchDisplayDelegate&为myController.SearchDisplayController.Delegate
  • 设置它
  • 覆盖ShouldReloadForSearchString - >启动一个调用Web服务的新线程并返回false以不重新加载UITableView
  • Web服务在后台完成 - >致电BeginInvokeOnMainThread()
  • 通过myController.SearchDisplayController.SearchResultsTableView.ReloadData()
  • 重新加载桌面视图

所有内容都适用于我的第一次搜索,我可以退格或键入并查看以异步方式弹出的新结果。

如果我完成搜索或取消搜索,然后再试一次,调用ReloadData()会导致以下崩溃:

2012-01-04 23:05:11.589 myApp[98047:2407] -[MainController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0xb0ea840
Stacktrace:

  at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) <IL 0x0009f, 0xffffffff>
  at MonoTouch.UIKit.UIApplication.Main (string[],string,string) [0x00042] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:29
  at MyApp.Application.Main (string[]) [0x00000] in /Users/jonathanpeppers/Projects/MyApp/Main.cs:13
  at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff>

我没有处理任何事情,并且我将所有代表保留在成员变量中以防止GC问题。每个后台线程似乎都正在调用BeginInvokeOnMainThread()

这很可能是MonoTouch中的一个错误吗?如果可能的话,我可以创建一个repro。

否则,如果我发现错误,请告诉我。

3 个答案:

答案 0 :(得分:2)

发现的解决方法:

  • WillBeginSearch
  • 中覆盖UISearchDisplayDelegate
  • searchController.SearchResultsTableView.Source设为null
  • 当您要显示结果时,请将searchController.SearchResultsTableView.Source设置为您的表格视图来源

但是要听听Xamarin是否认为这是一个错误。我也会在错误页面上发帖。

答案 1 :(得分:2)

这不是一个绑定错误(我检查过它们是肯定的)。数据源应在UISearchDisplayController上设置,而不是在表格视图上设置(例如SearchDisplayController.SearchResultsTableView)。

IOW替换:

        SearchDisplayController.SearchResultsTableView.Source = _tableSource;

使用:

        SearchDisplayController.SearchResultsSource = _tableSource;

这将确保在使用之间正确更新UISearchDisplayController的内部状态。

答案 2 :(得分:0)

“发送到实例的无法识别的选择器”也可以指示该对象已被垃圾收集到您发送的消息,您确定它在reloadData调用时仍然存在吗?

有时当我使用代码创建UI并在loadView方法中创建它并且仅在方法范围而不是类范围内具有表视图变量时,我会发生这种情况。

治愈很简单,把变量放在方法范围之外。