我使用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]
答案 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代码并通过其他方式控制它,可能是通过拦截标签栏事件。
这有帮助吗?