我有一个异步的UISearchBar设置如下:
myController.SearchDisplayController.Delegate
ShouldReloadForSearchString
- >启动一个调用Web服务的新线程并返回false以不重新加载UITableView
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。
否则,如果我发现错误,请告诉我。
答案 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方法中创建它并且仅在方法范围而不是类范围内具有表视图变量时,我会发生这种情况。
治愈很简单,把变量放在方法范围之外。