2010-11-03 3 views
1

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

То, что я пытаюсь добиться

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

Что случилось

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


Код Покушение 1 - Добавить и удалить "Busy View" из надтаблицы **

- (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, Busy View остается на экране.


Код Покушение 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" появится

ответ

1

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

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

Обратите внимание, что вам необходимо вызвать [MyLoadingView show] в отдельной теме.

+0

Thanks Kovpas, именно то, что я искал. Я создал статический класс с вызовом функции с потоковой загрузкой, который загружает представление, как вы говорите. – woot586

0

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

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