1

我试图在屏幕上一个接一个地显示 2 MBProgressHUD 消息。我发现第二条消息与第一条消息重叠,而不是连续出现。这就是我想要做的:

我有一个注销按钮单击它会触发它并调用“saveCartNotification”

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

“saveCartNotification”发布一个延迟 5 秒的 MBProgressHUD,然后调用“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 消息重叠。

您能否让我知道我缺少什么以及我需要做些什么才能一个接一个地收到我的消息。

非常感谢您的帮助。

谢谢,迈克

4

3 回答 3

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 都在屏幕上保留一段时间。

但是,根据您的应用程序中使用此流程的频率,对于更有经验的用户来说,不得不等待第一条消息消失可能会很烦人。我认为,对于每条消息,您可能不会延迟 5 秒,而是延迟 2 秒。

于 2013-03-20T08:59:45.877 回答
1

通过这个调用你的userLogOut ,

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

您必须这样做,因为您要给 MBProgressHUD 特定的时间来隐藏。

希望这会有所帮助,快乐编码。

于 2013-03-20T06:36:14.023 回答
0

创建两个单独的实例MBProgrressHUD或将您的注销调用更改为

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

由于您按顺序调用两个方法并使用相同的实例MBProgressHUD,因此该方法会立即覆盖第一个警报userLogout

于 2013-03-20T06:37:33.997 回答