iPhone Busy View - PullRequest
       16

iPhone Busy View

1 голос
/ 03 ноября 2010

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

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

  1. Пользователь нажимает кнопку поиска после ввода текста в UISearchBar.
  2. Введенный текст делегирован для searchBarSearchButtonClicked.
  3. Показать «Занятый вид», который представляет собой UIView, содержащий UIActivityIndicatorView, чтобы указать, что поиск выполняется.
  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 - Не отображалось сообщение «Busy View»

Ответы [ 2 ]

1 голос
/ 03 ноября 2010

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

  • Создать синглтон-класс MyLoadingView.Этот класс должен содержать статические методы show и hide.
  • В конструкторе MyLoadingView вы должны вручную создать представление с полупрозрачным черным фоном и представление активности внутри него.Поместите этот вид в [[UIApplication sharedApplication] keyWindow].Скрыть его.
  • [MyLoadingView show] вызов просто выводит объект myLoadingView на фронт в его контейнере: [[[UIApplication sharedApplication] keyWindow] bringSubviewToFront:myLoadingViewSharedInstance];.Также не забудьте запустить анимацию вида деятельности.
  • [MyLoadingView hide] останавливает анимацию вида деятельности и скрывает sharedInstanceView.

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

0 голосов
/ 03 ноября 2010

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

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

...