iOS MBProgressHUD: шоу в правильное время - PullRequest
3 голосов
/ 13 февраля 2012

У меня есть приложение с вкладками, использующее UITabBarController.Есть 2 вкладки, связанные с ViewController1 & ViewController2 соответственно.Когда каждый контроллер представления загружается, он будет получать данные с сервера.Поэтому для отображения статуса загрузки я использую MBProgressHUD.

Однако в настоящее время поведение выглядит следующим образом: когда я переключаю вкладку, приложение выглядит как зависшее.Но после загрузки данных с сервера MBProgressHUD мигает секунду, а затем исчезает, после чего вид меняется на новую вкладку.

Но то, что я хочу, это: MBProgressHUD показывает, когда однажды коснулась новой вкладки, а MBProgressHUD закрывает, когда данные заканчивают загрузку.Что я пропустил?

Вот код, который я использую:

- (void)viewDidLoad
{
    [super viewDidLoad];
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.labelText = NSLocalizedString(@"Loading", nil);
    // load data from server, parsing XML, etc
    [MBProgressHUD hideHUDForView:self.view animated:YES];
}

ОБНОВЛЕНИЕ : Здесь у меня есть пример проекта xCode, вы, ребята, можете попробовать егои скажи мне, что я пропустил.[ Ссылка для скачивания ]

Ответы [ 2 ]

4 голосов
/ 24 февраля 2012

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

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

[HUD showWhileExecuting:@selector(callingMethod) onTarget:self withObject:nil animated:YES];

-(void)callingMethod {
   [self performSelectorOnMainThread:@selector(dataLoadMethod) withObject:nil waitUntilDone:NO];
}
0 голосов
/ 24 февраля 2012

Смотрите мой ответ на похожую проблему здесь .

Мое основное мнение об использовании MBProgressHUD заключается в том, чтобы избегать взаимодействия с ним в методах жизненного цикла представления и вместо этого использовать специальные методы, которые контролируют только HUD. Например:

@interface MyViewController : UIViewController

-(void)presentHUDWithText:(NSString *)text;
-(void)dismissHUDWithDelay:(NSTimeInterval)delay; // type name correct? I forget

@end

UIKit очень хорошо сочетать анимации вместе, так что, например, если вы анимируете нажатие VC в одной строке кода, а затем сразу же в следующей заставляете отображать HUD, все это будет выглядеть очень хорошо когда VC скользит справа и HUD выскакивает сверху (вам может понадобиться установить HUD в окне для достижения этой цели). Кроме того, вы можете представить HUD в начале извлечения данных и отклонить его в конце. По моему опыту, выборка данных может быть очень быстрой, поэтому HUD представляется / удаляется слишком быстро. Чтобы компенсировать это, я просто использую NSTimer, чтобы закрыть HUD через полсекунды (или что-то другое).

Короче говоря, я говорю об удалении кода HUD из вашего viewDidLoad и управления им другими способами, например, путем перехвата события панели вкладок.

Помогает ли это?

...