2012-01-31 3 views
0

У меня небольшая проблема с MBProgressHUD в моем приложении.MBProgressHUD исчезает до окончания

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

[MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
[self performSelector:@selector(save) withObject:nil afterDelay:0.001]; 
[self refreshView]; 

Метод refreshView имеет эту линию в конце это исполнение:

[MBProgressHUD hideHUDForView:self.view animated:YES]; 

Шоу MBProgress как это должно быть, но в течение последней половины (ish) его продолжительности исчезает до едва заметного состояния, заставляя его выглядеть так, как если бы методы закончили выполнение, прежде чем они на самом деле закончили.

Любые идеи о том, что здесь может быть неправильным?

Большое спасибо!

ответ

2

Концепция, которую вам нужно понять, это концепция цикла запуска. Цикл запуска - это внутренний цикл в вашей программе, который обрабатывает входящие события, таймеры, сети и т. Д. (Он предоставляется и запускается системой, поэтому вы фактически не видите этот цикл в своем коде.)

С этим линия:

[self performSelector:@selector(save) withObject:nil afterDelay:0.001]; 

вы запланировать -save выполнение действия через 1 мс. (Или более поздней версии, если основной поток занят чем-то другим)

После планирования это -save (так не после того, как работает его) вы называете refreshView, которая скрывает HUD.

Так что на самом деле происходит то, что вы показываете и скрываете HUD за один раз. Таким образом, вы видите нечто вроде комбинированной анимации, показывающей и скрывающей ее. Независимо вызывается метод -save.

В отличие от того, что предлагает UIAdam, вам нужен performSelector:afterDelay:, потому что вам нужно дать циклу запуска некоторое время, чтобы дышать и отображать ваши глазные конфеты на экране. Изменения в пользовательском интерфейсе происходят не сразу, а только по мере возврата программы в цикл выполнения.

Исправление поэтому брать эту строку:

[self refreshView]; 

и переместить его в конце вашего метода -save.

+0

Я ценю простое объяснение цикла запуска. Это то, что я изо всех сил пытался понять за прошедшие пару дней. Вы совершенно правы, перемещая метод обновления до конца моего метода сохранения, решили проблему! Спасибо! –

2

Трудно дать точное решение, не видя больше вашего кода. Но в основном проблема, вероятно, имеет отношение к тому факту, что вы вызываете [self refreshView] и поэтому [MBProgressHUD hideHUDForView:self.view animated:YES] перед тем, как ваш метод save даже называется. Почему бы вам не скрыть HUD в конце метода save или позвонить по телефону save напрямую, а не после задержки. Я не уверен, почему вам нужно выполнить сохранение после задержки.

+0

Я не совсем понимаю это сам, однако этот вопрос здесь: http://stackoverflow.com/questions/5685331/run-mbprogresshud-in-another-thread привело меня к этой конфигурации кода, который у меня есть ... Если я сделаю [self save]; вместо кода performSelector, экран замерзает на секунду, а затем мигает progressHUD. –

+1

@UIAdam: вам нужно выполнить сохранение после задержки, см. Мой ответ для объяснения. – mvds

+0

Несомненно, имеет смысл. Я забыл, что HUD понадобится шанс оживить, прежде чем вы попытаетесь сохранить. – UIAdam

Смежные вопросы