我试图在屏幕上依次显示2条MBProgressHUD消息。我发现第二条消息与第一条消息重叠,而不是它们串行出现。这就是我想要做的事情:
我点击退出按钮会触发此按钮并调用“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现在发布另一条延迟5秒的MBProgressHUD消息:
- (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)来自“saveCartNotification”的MBProgressHUD消息 2)上面的消息保持5秒钟并消失 3)来自“userLogOut”的MBProgressHUD消息 4)上面的消息再次保持5秒钟消失
但是发生的事情是两条消息似乎同时出现在屏幕上,来自“userLogOut”的MBProgressHUD消息与来自“saveCartNotification”的MBProgressHUD消息重叠。
请您告诉我我错过了什么,以及我需要做什么才能一个接一个地连续发送消息。
非常感谢您的帮助。
谢谢, 麦克
答案 0 :(得分:2)
问题在于,您希望消息能够以相当长的时间(以计算机术语)连续出现,而这些HUD要表示的两个过程会一个接一个地快速发生。
您的saveCartNotification
方法准备用于显示所需文本的HUD的单个实例。然后,紧接着您触发userLogOut
方法,用自己的消息替换HUD。
所以我现在可以想到两种可能性:
MBProgressHUD
上有一个名为- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(MBProgressHUDCompletionBlock)completion
的方法。在第一个块中,您执行保存并且可以 - 因为它在后台线程上运行 - 在其中使用一些基于NSThread sleepForTimeInterval:
的延迟将消息留在屏幕上一段时间。然后在完成块中触发注销。通过这种方式,您可以有效地序列化呼叫,从而使两个HUD在屏幕上保留一段时间。但是,根据您的应用中使用此流的频率,有经验的用户必须等待第一条消息消失可能会很烦人。我想,你可能会做的不是5,但每条消息可能有2秒的延迟。
答案 1 :(得分:1)
通过此
调用 userLogOut[self performSelector:@selector(userLogOut) withObject:nil afterDelay:5];
你必须这样做是因为你给了MBProgressHUD特定的时间来隐藏。
希望这有帮助,快乐编码。
答案 2 :(得分:0)
创建两个单独的MBProgrressHUD
实例或将您的注销调用更改为
[self performSelector:@selector(userLogOut) withObject:nil afterDelay:5];
因为你要按顺序调用两个方法&使用MBProgressHUD
的同一个实例,userLogout
方法会立即覆盖第一个警报。