2012-01-31 75 views
0

我的应用程序中出现MBProgressHUD的小问题。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)会淡化到几乎不可见的状态,使得它看起来好像这些方法在它们实际完成之前完成了执行。

上什么可能是错误怎么回事任何想法?

非常感谢!

回答

2

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

使用此行:

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

您安排-save行动后1毫秒运行。 (或更高版本,如果主线程忙于做其他事情)

调度在此之后-save(所以不运行后它),你打电话给你的refreshView其中隐藏HUD。

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

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

的修复,因此是走这条线:

[self refreshView]; 

并将其移动到您的-save方法结束。

+0

我欣赏对运行循环的简单解释。这是我一直努力想要了解过去几天的事情。 你是完全正确的,将刷新方法移动到我的保存方法的末尾解决了问题! 谢谢! – 2012-01-31 02:04:53

2

很难给出一个确切的解决方案,而看到您的更多代码。但基本上,这个问题可能与您在调用和因此调用save方法之前调用[self refreshView]这一事实有关。为什么不直接在save方法末尾隐藏HUD,或直接拨打save而不是延迟。我不确定为什么你必须延迟执行保存。

+0

我不完全了解我自己,但是这个问题在这里:http://stackoverflow.com/questions/5685331/run-mbprogresshud-in-another-thread导致我的代码,这个配置我有... 如果我[自我保存];而不是performSelector代码,然后屏幕冻结一秒钟,然后闪烁progressHUD。 – 2012-01-31 01:35:02

+1

@UIAdam:您必须延迟执行保存,请参阅我的答案以获得解释。 – mvds 2012-01-31 01:45:19

+0

当然,非常有意义。我忘记了HUD在您尝试保存之前需要有机会进行动画制作。 – UIAdam 2012-01-31 02:11:14

相关问题