iOS 在视图出现之前调用 viewDidAppear

iOS viewDidAppear called before view appears

我正在开发带有 UISplitView 的 iPhone/iPad 应用程序。在左侧面板中,我有一个 table,所有单元格都有 "Show Detail" 连接到右侧面板的导航控制器。

在用户在 table 中选择一个选项后,我为新视图做了一些冗长的计算,所以我有一个 UIActivityIndi​​catorView,我在 "viewWillAppear" 中开始设置动画。在 viewDidAppear 中,我执行计算,然后刷新适当的 UI 元素并停止 UIActivityIndi​​catorView。

这在 iPhone 上按预期工作:用户点击 table 中的项目,出现新视图,没什么可说的(但显示了一点 activity 指示器),然后一两秒钟后,它会填入正确的信息。

在 iPad 上,看起来应用程序在点击 table 中的项目后冻结了。然后数据在几秒钟后出现。 (我的测试 iPad 是第一代 mini,所以速度较慢,这对我没有帮助。)没有 activity 指标。

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

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

提前致谢...

你应该异步执行此操作,你的性能会受到影响,因为你渲染数据的过程相当大且耗时,你需要的是在

内完成所有这些
    //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`

        });
    });

它可能会如您所愿。

我最终通过添加延迟计算解决了这个问题。 viewDidAppear先出现view的基本情况还是很烦人,不过这个workaround就涵盖了。

- (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];
}