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]; 
} 
+0

还有一件事要补充:配置'MBProgressHUD'的委托。 – Raptor 2012-02-26 01:32:06

+1

你已经有了这个代码,所以我没有包含它。但是,是的,您需要在调用-showWhileExecuting之前配置HUD。很高兴我能帮上忙。 – 2012-02-26 15:45:51

查看我对类似问题的回答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代码,并通过其他方式控制它,也许是通过拦截标签栏事件。

这有帮助吗?