我正在使用UISplitView开发iPhone / iPad应用程序。 在左侧面板中,我有一张桌子,并且所有单元格都有“ Show Detail”选项,用于右侧面板的导航控制器。
在用户在表中选择一个选项后,我对新视图进行了一些冗长的计算,因此我有了一个UIActivityIndicatorView,该动画开始在“ viewWillAppear”中设置动画。 在viewDidAppear中,我执行计算,然后刷新适当的UI元素并停止UIActivityIndicatorView。
这可以在iPhone上按预期方式工作:用户点击表中的项目,出现的新视图没有太多要说的内容(但显示了一点活动指示符),然后一两秒钟后,它会填充正确的信息。
在iPad上,点击表中的项目后,看起来好像该应用程序冻结了。 几秒钟后,数据出现。 (这并不能帮助我测试的iPad是第一代mini,因此速度较慢。)没有活动指示器。
在调试中,我发现viewDidAppear实际上是在视图出现之前调用的 。 除非viewDidAppear方法返回,否则显示什么都不会发生。 我已经在断点处看到了这一点,但是通过在ViewDidAppear的开头和结尾放置NSLog语句,我也确认了没有断点。
因此,这看起来很糟糕; 我想知道我是否可以对我的Segue,View Controller,Navigation Controller或Split View Controller做任何事情,使其表现出我想要的方式?
提前致谢...
我最终通过添加延迟计算来解决此问题。 viewDidAppear出现在视图出现之前的基本情况仍然很烦人,但是此替代方法可以解决此问题。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// Use delayed computation to get around "viewDidAppear" sometimes being called before view appears.
[self.activityIndicator startAnimating];
[self performSelector:@selector(delayedComputation) withObject:nil afterDelay:0.01f];
}
- (void)delayedComputation
{
// (Perform lengthy calculations...)
// (Refresh UI with results...)
[self.activityIndicator stopAnimating];
}
您应该异步执行此操作,因为要呈现数据的过程相当庞大且耗时,所以性能会受到影响,您需要在内部完成所有这些操作
//Show you spinner here
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
//Background Thread, your logic for get data
dispatch_async(dispatch_get_main_queue(), ^(void){
//Run UI Updates and hide spinner`enter code here`
});
});
并且可能会表现出您想要的效果。