3

我有一个使用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 项目,你们可以试一试,告诉我我错过了什么。[下载链接]

4

2 回答 2

4

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

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

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

-(void)callingMethod {
   [self performSelectorOnMainThread:@selector(dataLoadMethod) withObject:nil waitUntilDone:NO];
}
于 2012-02-24T17:51:18.187 回答
0

在此处查看我对类似问题的回答。

我对使用的基本看法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 代码并通过其他方式控制它,也许是通过拦截标签栏事件。

这有帮助吗?

于 2012-02-24T17:29:14.627 回答