iOS MBProgressHUD:在正确的时间显示

时间:2012-02-13 02:54:39

标签: ios5 mbprogresshud

我使用UITabBarController创建了一个标签式应用。有2个标签,链接到ViewController1&分别为ViewController2。当每个视图控制器加载时,它将从服务器获取数据。因此,我使用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];
}

更新:这里有一个示例xCode项目,你们可以尝试一下,告诉我我错过了什么。 [Download Link]

2 个答案:

答案 0 :(得分:4)

我之前遇到过同样的问题。 HUD需要访问主线程才能显示。我的猜测是你在一个阻塞主线程的嵌套方法中调用它。

尝试调用在主线程上调用工作负载的方法。这将显示您的HUD并在需要时解雇。

[HUD showWhileExecuting:@selector(callingMethod) onTarget:self withObject:nil animated:YES];

-(void)callingMethod {
   [self performSelectorOnMainThread:@selector(dataLoadMethod) withObject:nil waitUntilDone:NO];
}

答案 1 :(得分:0)

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

这有帮助吗?