MBProgressHUD - 连续2条消息重叠

时间:2013-03-20 06:23:53

标签: ios objective-c mbprogresshud

我试图在屏幕上依次显示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消息重叠。

请您告诉我我错过了什么,以及我需要做什么才能一个接一个地连续发送消息。

非常感谢您的帮助。

谢谢, 麦克

3 个答案:

答案 0 :(得分:2)

问题在于,您希望消息能够以相当长的时间(以计算机术语)连续出现,而这些HUD要表示的两个过程会一个接一个地快速发生。

您的saveCartNotification方法准备用于显示所需文本的HUD的单个实例。然后,紧接着您触发userLogOut方法,用自己的消息替换HUD。

所以我现在可以想到两种可能性:

  1. 由于保存非常快,您完全摆脱了该步骤的HUD。如果您愿意,您可能需要以某种方式调整注销所显示的文本以通知用户有关已保存的购物车。
  2. 只有在第一个HUD消失时才会触发注销。 MBProgressHUD上有一个名为- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(MBProgressHUDCompletionBlock)completion的方法。在第一个块中,您执行保存并且可以 - 因为它在后台线程上运行 - 在其中使用一些基于NSThread sleepForTimeInterval:的延迟将消息留在屏幕上一段时间。然后在完成块中触发注销。通过这种方式,您可以有效地序列化呼叫,从而使两个HUD在屏幕上保留一段时间。
  3. 但是,根据您的应用中使用此流的频率,有经验的用户必须等待第一条消息消失可能会很烦人。我想,你可能会做的不是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方法会立即覆盖第一个警报。