在view出现之前调用的iOS viewDidAppear

时间:2016-03-07 13:01:02

标签: ios ipad uisplitviewcontroller viewdidappear

我正在使用UISplitView处理iPhone / iPad应用程序。在左侧面板中,我有一个表格,所有单元格都有"显示详细信息" segue到右侧面板的导航控制器。

在用户选择表格中的选项后,我对新视图做了一些冗长的计算,所以我有一个UIActivityIndi​​catorView,我开始在" viewWillAppear"中进行动画制作。在viewDidAppear中,我执行计算,然后刷新相应的UI元素并停止UIActivityIndi​​catorView。

这在iPhone上按预期工作:用户点击表中的项目,新视图出现时没有太多要说(但显示一点活动指示),然后一两秒后它会填入正确的信息。

在iPad上,点击表格中的项目后,应用程序看起来就像冻结一样。然后几秒后出现数据。 (没有帮助我的测试iPad是第一代迷你版,因此速度较慢。)没有活动指示。

在调试中,我发现viewDidAppear在视图出现之前实际上被称为 。在viewDidAppear方法返回之前,显示没有任何反应。我已经通过断点看到了这一点,但我也通过在viewDidAppear的开头和结尾放置NSLog语句来确认它没有断点。

所以这看起来很糟糕;我想知道我能为我的Segue,View Controller,Navigation Controller或Split View控制器做些什么来让它按照我想要的方式运行吗?

提前致谢...

2 个答案:

答案 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;
}

并且可能会按照您的意愿行事。