Вопрос

Я пытаюсь получить занятый вид, отображаемый во время процесса поиска, однако, не отображается.

Что я пытаюсь достичь

  1. Пользователь нажимает на кнопку поиска, как только они ввели текст в UISearchBar.
  2. Введенный текст делегируется для поиска поиска.
  3. Показать «оживленный вид», который является UIView, содержащий UiActivityIdicatorView, чтобы указать, что поиск идет до конца.
  4. Выполните поиск, который общается с веб-сайтом.
  5. При завершении поиска удалить «оживленный вид».

Что не так

Процесс поиска работает нормально, используя отладчик, я могу видеть, что он продвигается через функцию SearchBarSearchButtonClicked, однако, что «оживленное представление» никогда не появляется. Поиск занимает 2-3 секунды, поэтому в теории я должен увидеть мой «оживленный взгляд» для этих 2-3 секунды.


Попытка кода 1 - Добавить и удалить «оживленный вид» из руководства **

- (void)searchBarSearchButtonClicked:(UISearchBar *)activeSearchBar {

 [activeSearchBar setShowsCancelButton:NO animated:YES];
 [activeSearchBar resignFirstResponder];
 [busyView activateSpinner]; //start the spinner spinning
 [self.view addSubview:busyView]; //show the BusyView

 Search *search = [[Search alloc]init];
 results = [search doSearch:activeSearchBar.text];

 [busyView deactivateSpinner]; //Stop the spinner spinning
 [busyView removeFromSuperview]; //remove the BusyView
 [search release]; search = nil;

}

Результаты попытки 1 - Это не появляется, однако, если я прокомментирую вызов RemoveFromsuperView, на экране остается на экране.


Попытка кода 2 - используя анимацию

- (void)searchBarSearchButtonClicked:(UISearchBar *)activeSearchBar {



[activeSearchBar setShowsCancelButton:NO animated:YES]; 
 [activeSearchBar resignFirstResponder];

 [UIView beginAnimations:nil context:nil];
 [UIView setAnimationDuration:0];
 [UIView setAnimationDelegate:self];
 [UIView setAnimationDidStopSelector:@selector(animationDidStop)];

 [busyView activateSpinner]; //start spinning the spinner
 [self.view addSubview:busyView]; //show the busy view

 [UIView commitAnimations];

 Search *search = [[Search alloc]init];
 results = [search doSearch:activeSearchBar.text];


 [UIView beginAnimations:nil context:nil];
 [UIView setAnimationDuration:0];
 [UIView setAnimationDelegate:self];
 [UIView setAnimationDidStopSelector:@selector(animationDidStop)];

 [busyView deactivateSpinner]; //sets stops the spinner spinning
 [busyView removeFromSuperview]; //remove the view

 [UIView commitAnimations];
 [search release]; search = nil;
}

Результаты попытки 2 - Не видел, как появляются «оживленные взгляды»

Это было полезно?

Решение

Ну вот мое решение:

  • Создайте Singleton Class MyLoadingView. Этот класс должен содержать показать и скрывать статические методы.
  • В конструкторе MyloadingView вы должны вручную создать вид с полупрозрачным черным фоном и активностью View внутри него. Поместите этот вид в [[UIApplication sharedApplication] keyWindow]. Отказ Скрыть.
  • [MyLoadingView show] Вызов просто приносит объект MyLoadingView на переднем контейнере: [[[UIApplication sharedApplication] keyWindow] bringSubviewToFront:myLoadingViewSharedInstance];. Отказ Также не забудьте начать ActivityView Animation.
  • [MyLoadingView hide] Останавливает AttiationView Animation и скрывает SharedInstanceView.

Пожалуйста, обратите внимание, что вам нужно вызвать [MyLoadingView show] в отдельной ните.

Другие советы

Изменения интерфейса UI в какао вступают в силу только в следующий раз, когда ваш код возвращает Control в цикл Run. До тех пор, пока ваша поисковая задача работает синхронно на главной ните, она будет блокировать выполнение, включая обновления пользовательских интерфейсов.

Вы должны выполнить трудоемкую задачу асинхронно на заднем плане. Для этого есть ряд вариантов (NSOperation, performSelectorInBackground:..., Гранд Центральная отправка, ...).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top