【问题标题】:MBProgressHUD fades before finishingMBProgressHUD 在完成前消失
【发布时间】:2012-01-31 01:12:40
【问题描述】:

我的应用中的 MBProgressHUD 有一个小问题。

基本上我以我能找到的最简单的方式使用它:

[MBProgressHUD showHUDAddedTo:self.view animated:YES];
[self performSelector:@selector(save) withObject:nil afterDelay:0.001];
[self refreshView];

方法 refreshView 在其执行结束时有这一行:

[MBProgressHUD hideHUDForView:self.view animated:YES];

MBProgress 准确地显示了它应该如何显示,但在其持续时间的后半部分(ish)逐渐消失到几乎不可见的状态,使得方法看起来好像在它们实际完成之前已经完成执行。

对这里可能出现的问题有什么想法吗?

非常感谢!

【问题讨论】:

    标签: iphone objective-c ios mbprogresshud


    【解决方案1】:

    您需要了解的概念是运行循环。运行循环是程序中处理传入事件、计时器、网络等的内部循环。(它由系统提供和运行,因此您实际上不会在代码中看到此循环。)

    用这一行:

    [self performSelector:@selector(save) withObject:nil afterDelay:0.001];
    

    您安排 -save 操作在 1 毫秒后运行。 (或者稍后,如果主线程忙于做其他事情)

    调度这个-save之后(所以不是在运行之后)你调用你的refreshView来隐藏HUD。

    所以实际发生的情况是您一次性显示和隐藏 HUD。所以你会看到显示和隐藏它的组合动画。独立地,您的 -save 方法被调用。

    与 UIAdam 的建议相反,您确实需要 performSelector:afterDelay:,因为您需要给运行循环一些时间来呼吸并在屏幕上显示您的眼睛糖果。用户界面的更改不会立即发生,而只会在程序返回运行循环时发生。

    因此,解决方法是采用这条线:

    [self refreshView];
    

    并将其移至 -save 方法的末尾。

    【讨论】:

    • 我很欣赏运行循环的简单解释。这是我过去几天一直在努力掌握的东西。你是对的,将刷新方法移动到我的保存方法的末尾解决了这个问题!谢谢!
    【解决方案2】:

    如果不查看更多代码,很难给出精确的解决方案。但基本上问题可能与您在调用 save 方法之前调用 [self refreshView] 并因此调用 [MBProgressHUD hideHUDForView:self.view animated:YES] 的事实有关。为什么不将HUD隐藏在save方法的末尾,或者直接调用save而不是延迟之后。我不知道为什么您必须在延迟后执行保存。

    【讨论】:

    • 我自己并不完全理解,但是这里的这个问题:stackoverflow.com/questions/5685331/… 引导我使用我拥有的这种代码配置......如果我这样做 [self save];而不是 performSelector 代码,然后屏幕冻结一秒钟,然后闪烁 progressHUD。
    • @UIAdam:您必须在延迟后执行保存,请参阅我的答案以获得解释。
    • 当然,完全有道理。我忘记了在您尝试保存之前,HUD 需要有机会进行动画处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 2022-11-09
    相关资源
    最近更新 更多