我有一个应用程序,它以一个加载多个导航控制器的tableview(来自xib)开头。如果正在进行长初始化序列,我想在启动时呈现模态视图。我尝试在App Delegate中呈现模态视图,但直到底层代码已经完成之后才会出现视图。
MainWindow.xib加载了TableViewController,所以我将调用nowmodalview放在View Will Appear中,结果相同。我有很多NSLOG调用,所以我可以看到正在发生的事情,但我无法弄清楚为什么在app delegate和tableview控制器的viewWillAppear完成之后视图才会出现。我将调用移动到viewDidAppear,结果相同。这是一段代码:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Add the tab bar controller's current view as a subview of the window
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];
[[UIApplication sharedApplication] setStatusBarHidden:NO];
// if new version being installed do init stuff
if ( <needs update code here>) {
Uncompress *uncompressView = [[Uncompress alloc] initWithNibName:@"Uncompress" bundle:nil];
[self.tabBarController presentModalViewController:uncompressView animated:NO];
[uncompressView release];
}
}
我还尝试将presentmodalviewcontroller
更改为[window addSubview:uncompressView.view]
而没有任何运气。
更新代码运行得很好,问题是在AppDelegate和TableView完成之前视图才会出现。我不是以编程方式创建任何视图 - 所有视图都来自Xib。我无法弄清楚在何处调用更新功能以使视图立即显示。任何帮助赞赏。谢谢!
答案 0 :(得分:2)
在iOS上,只有在代码将控制权返回到运行循环时才会更新UI。因此,如果您的解压缩任务需要花费很多时间,那么UI只会在完成后更新。
您可以通过将时间密集型任务放在单独的方法中并使用[self performSelector:... afterDelay:0.0 ...];
调用该方法来解决此问题,但这不是一个好的解决方案,因为即使UI将更新,用户也可以与只要您的代码阻止主线程,您的应用仍将被阻止。如果您的代码运行时间超过几秒钟(例如,因为它在较旧的较慢设备上运行),则OS监视程序计时器将终止您的应用程序。
最好的解决方案是将时间密集型任务放在后台线程中,例如使用NSOperation
或dispatch_async()
。