0

我在我的应用程序中遇到了 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)逐渐消失到几乎不可见的状态,使得方法看起来好像在它们实际完成之前已经完成执行。

关于这里可能出了什么问题的任何想法?

非常感谢!

4

2 回答 2

2

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

于 2012-01-31T01:22:56.973 回答
2

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

有了这条线:

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

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

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

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

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

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

[self refreshView];

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

于 2012-01-31T01:44:17.903 回答