MonoTouch - асинхронный UISearchBar - PullRequest
2 голосов
/ 05 января 2012

У меня есть асинхронная настройка UISearchBar следующим образом:

  • Inherit UISearchDisplayDelegate и установите его для myController.SearchDisplayController.Delegate
  • Переопределить ShouldReloadForSearchString -> запустить новый поток, вызывающий веб-сервис, и вернуть 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? Если это возможно, я могу создать копию.

В противном случае, дайте мне знать, если я поступаю неправильно.

Ответы [ 3 ]

2 голосов
/ 07 января 2012

Обнаружен обходной путь:

  • переопределить WillBeginSearch в UISearchDisplayDelegate
  • установить searchController.SearchResultsTableView.Source на ноль
  • когда у вас есть результаты для отображения, установите searchController.SearchResultsTableView.Source в качестве источника табличного представления

Еще предстоит узнать, считает ли Ксамарин, что это ошибка или нет. Я также буду публиковать на странице ошибок.

2 голосов
/ 12 января 2012

Это не обязательная ошибка (я проверил их, чтобы убедиться). Источник данных должен быть установлен на UISearchDisplayController, а не в табличном представлении (например, SearchDisplayController.SearchResultsTableView).

IOW заменяет:

        SearchDisplayController.SearchResultsTableView.Source = _tableSource;

с:

        SearchDisplayController.SearchResultsSource = _tableSource;

Это обеспечит правильное обновление внутреннего состояния UISearchDisplayController между использованиями.

0 голосов
/ 05 января 2012

«нераспознанный селектор, отправленный экземпляру» также может указывать на то, что объект был собран мусором, которому вы отправляете сообщение. Вы уверены, что он все еще существует во время вызова reloadData?

Это иногда случается со мной, когда я создаю пользовательский интерфейс с кодом и создаю его внутри метода loadView, и переменная табличного представления задается только в области видимости метода, а не в области класса.

Вылечить просто, поместите переменную вне области действия метода.

...