iOS MBProgressHUD:在正确时间显示
我有一个使用UITabBarController
的选项卡式应用程序。有2个选项卡,分别链接到ViewController1
& ViewController2
。当每个视图控制器加载时,它将从服务器获取数据。因此我使用MBProgressHUD
来显示加载状态。iOS MBProgressHUD:在正确时间显示
但是,行为目前的行为如下:当我切换标签页时,该应用程序看起来像是被吊起来的。但是,从服务器加载数据后,MBProgressHUD
闪烁一秒然后消失,然后视图更改为新选项卡。
但我想要的是:MBProgressHUD
显示新标签一旦被触摸,并且MBProgressHUD
在数据加载完成时关闭。我错过了什么?
这里是我使用的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.labelText = NSLocalizedString(@"Loading", nil);
// load data from server, parsing XML, etc
[MBProgressHUD hideHUDForView:self.view animated:YES];
}
UPDATE:在这里,我有一个样品的Xcode项目,你们可以试一试,并告诉我,我错过了什么。 [Download Link]
我以前有过这个相同的问题。 HUD需要访问主线程才能显示。我的猜测是你在一个嵌套的方法中调用它来阻塞主线程。
尝试调用在主线程上调用您的工作负载的方法。这将显示您的HUD并在需要时解雇。
[HUD showWhileExecuting:@selector(callingMethod) onTarget:self withObject:nil animated:YES];
-(void)callingMethod {
[self performSelectorOnMainThread:@selector(dataLoadMethod) withObject:nil waitUntilDone:NO];
}
查看我对类似问题的回答here。
我对使用MBProgressHUD
的基本观点是为了避免在视图生命周期方法中与其交互,而是使用专门的方法来控制HUD。例如:
@interface MyViewController : UIViewController
-(void)presentHUDWithText:(NSString *)text;
-(void)dismissHUDWithDelay:(NSTimeInterval)delay; // type name correct? I forget
@end
UIKit
约合成动画在一起非常好,所以,例如,如果你在一行代码,立即在接下来的事业动画一个VC推,然后将HUD显示,它当VC从右侧滑入并且HUD在顶部弹起时(您可能需要将HUD放置在窗口中以实现此目的),所有这些都将看起来非常漂亮。此外,您可以在数据获取开始时展示HUD,并在最后解散它。根据我的经验,数据提取速度可能非常快,因此HUD的提交/解散速度太快。为了弥补这一点,我只需要使用NSTimer
就可以在半秒钟之后关闭HUD(或者任何感觉都是正确的)。
总之,我想说的是从上面的viewDidLoad
中删除HUD代码,并通过其他方式控制它,也许是通过拦截标签栏事件。
这有帮助吗?
还有一件事要补充:配置'MBProgressHUD'的委托。 – Raptor 2012-02-26 01:32:06
你已经有了这个代码,所以我没有包含它。但是,是的,您需要在调用-showWhileExecuting之前配置HUD。很高兴我能帮上忙。 – 2012-02-26 15:45:51