我正在使用UISplitView处理iPhone / iPad应用程序。在左侧面板中,我有一个表格,所有单元格都有"显示详细信息" segue到右侧面板的导航控制器。
在用户选择表格中的选项后,我对新视图做了一些冗长的计算,所以我有一个UIActivityIndicatorView,我开始在" viewWillAppear"中进行动画制作。在viewDidAppear中,我执行计算,然后刷新相应的UI元素并停止UIActivityIndicatorView。
这在iPhone上按预期工作:用户点击表中的项目,新视图出现时没有太多要说(但显示一点活动指示),然后一两秒后它会填入正确的信息。
在iPad上,点击表格中的项目后,应用程序看起来就像冻结一样。然后几秒后出现数据。 (没有帮助我的测试iPad是第一代迷你版,因此速度较慢。)没有活动指示。
在调试中,我发现viewDidAppear在视图出现之前实际上被称为 。在viewDidAppear方法返回之前,显示没有任何反应。我已经通过断点看到了这一点,但我也通过在viewDidAppear的开头和结尾放置NSLog语句来确认它没有断点。
所以这看起来很糟糕;我想知道我能为我的Segue,View Controller,Navigation Controller或Split View控制器做些什么来让它按照我想要的方式运行吗?
提前致谢...
答案 0 :(得分:3)
我最终通过添加延迟计算来解决这个问题。在视图出现之前出现的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];
}
答案 1 :(得分:1)
您应该异步执行此操作,因为您执行的用于呈现数据的流程相当大且持久,您需要的是在
中完成所有这些操作,因此您的性能会受到影响function size(obj, enumerablesOnly) {
return enumerablesOnly === false ?
Object.getOwnPropertyNames(obj).length :
Object.keys(obj).length;
}
并且可能会按照您的意愿行事。