今天写代码时发现hud没有显示出来,把耗时操作注释掉就可以显示出来,找到资料说出现原因是:UIKit 不能在当前run loop结束前重画,即需要在下一个run loop 周期才能重画,更新UI。
在这里记录一下方便以后查看:
出现问题情况:如下例子中,要等到for循环结束后才能显示出来。
- (IBAction)showTextOnly:(id)sender {
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
hud.mode = MBProgressHUDModeText;
hud.labelText = @"Some message...";
hud.margin = 10.f;
hud.removeFromSuperViewOnHide = YES;
for (int i=0; i<5; i++) {
sleep(1);
}
}
解决方案:
1.在下面方法运行你的耗时程序,然后在myTadk结束时隐藏 HUD
[self performSelector:@selector(myTask) withObject:nil afterDelay:0.001];
2.可以手动运行 run loop
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantPast]];
3.使用blocks
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.001 * NSEC_PER_SEC), dispatch_get_main_queue(), ^(void){
// Insert myTask code here
});