2013-03-20 3 views
0

Я пытаюсь показать сообщения 2 MBProgressHUD на экране один за другим. Я нахожу, что второе сообщение перекрывает первое, а не появляется последовательно. Это то, что я пытаюсь сделать:MBProgressHUD - 2 последовательных сообщения перекрываются

У меня есть кнопка выхода из системы щелчки, который выстреливает это и называет «saveCartNotification»

- (IBAction)logout:(id)sender { 
    [self saveCartNotification]; 
} 

«saveCartNotification» Отправляет MBProgressHUD с задержкой в ​​5 секунд, а затем вызывает " UserLogout»

- (void)saveCartNotification{ 
    self.hud = [[MBProgressHUD alloc] initWithView:self.view]; 
    self.hud.labelText = @"Saving your cart.."; 
    self.hud.mode = MBProgressHUDModeIndeterminate; 
    self.hud.dimBackground = YES; 
    self.hud.animationType = MBProgressHUDAnimationFade; 
    [self.view addSubview:self.hud]; 
    [self.hud show:YES]; 
    [self.hud hide:YES afterDelay:5]; 
    [self.hud show:YES]; 
    self.hud.labelText = @"Saving Cart and Favorites"; 
    [self.hud hide:YES afterDelay:5]; 

//Logout 
[self userLogOut]; 

}

UserLogout Сейчас отправляет еще одно сообщение MBProgressHUD с задержкой в ​​5 секунд:

- (void)userLogOut{ 
    self.hud = [[MBProgressHUD alloc] initWithView:self.view]; 
    self.hud.labelText = @"Logging out securely"; 
    self.hud.mode = MBProgressHUDModeIndeterminate; 
    self.hud.dimBackground = YES; 
    self.hud.animationType = MBProgressHUDAnimationFade; 
    [self.view addSubview:self.hud]; 
    [self.hud show:YES]; 
    [self.hud hide:YES afterDelay:5]; 
} 

Так я называю эти методы последовательно, мое ожидаемое поведение:

1) MBProgressHUD сообщения от "saveCartNotification" 2) выше сообщения остается в течение 5 секунд и исчезает 3) MBProgressHUD сообщения от " UserLogout» 4) Над сообщения снова остается в течение 5 секунд и исчезает

Но что происходит, оба сообщения опоздавших на экране в то же время с MBProgressHUD сообщением от„UserLogout“перекрывающегося MBProgressHUD сообщения от„saveCartNotification“.

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

Ваша помощь очень ценится.

Спасибо, Майк

+0

Я думаю, вам нужны отдельные экземпляры «MBProgressHUD» – tGilani

ответ

2

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

Ваш метод подготавливает один экземпляр HUD, который вы используете для отображения нужного текста. Затем сразу же вы вызываете метод userLogOut, который заменяет HUD собственным сообщением.

Итак, есть две возможности я могу думать прямо сейчас:

  1. В связи с тем, что экономия на самом деле быстро, вы избавиться от HUD для этого шага полностью. Возможно, вам захочется отрегулировать текст, отображаемый в результате выхода из системы, как-то, чтобы сообщить пользователю о сохраненной тележке, если хотите.
  2. Вы только запускаете выход, когда первый HUD уходит. Существует метод на MBProgressHUD под названием - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(MBProgressHUDCompletionBlock)completion. В первом блоке вы делаете сохранение и можете - потому что он работает в фоновом потоке - используйте некоторую задержку на основе NSThread sleepForTimeInterval: внутри нее, чтобы некоторое время оставить сообщение на экране. Затем в блоке завершения вы вызываете выход из системы. Таким образом, вы эффективно сериализуете вызовы, заставляя оба HUD оставаться на экране в течение некоторого времени.

Однако, в зависимости от того, как часто этот поток используется в вашем приложении, может быть досадно, чтобы более опытный пользователь должен был дождаться исчезновения первого сообщения. Я думаю, вы, вероятно, поправитесь с не 5, а, возможно, за 2 секунды задержки для каждого сообщения.

+0

+1 для альтернативного предложения. 5 секунд для уведомления (предупреждения) слишком длинны. – viral

+0

@ Даниэль Шнеллер - работал как шарм. Спасибо за отличный совет! –

1

называют свой UserLogout по этому,

[self performSelector:@selector(userLogOut) withObject:nil afterDelay:5]; 

вы должны сделать это, потому что вы даете определенное время на MBProgressHUD для шкурой.

Надеюсь, что это помогает, счастливое кодирование.

0

Либо создать два отдельных экземпляра MBProgrressHUD или изменения выхода из системы вызова

[self performSelector:@selector(userLogOut) withObject:nil afterDelay:5]; 

Поскольку вы вызываете два метода последовательно &, используя тот же экземпляр MBProgressHUD, первое предупреждение отменяется немедленно методом userLogout.

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