在视图出现之前调用iOS viewDidAppear

最后发布: 2016-03-07 13:01:01


问题

我正在使用UISplitView开发iPhone / iPad应用程序。 在左侧面板中,我有一张桌子,并且所有单元格都有“ Show Detail”选项,用于右侧面板的导航控制器。

在用户在表中选择一个选项后,我对新视图进行了一些冗长的计算,因此我有了一个UIActivityIndi​​catorView,该动画开始在“ viewWillAppear”中设置动画。 在viewDidAppear中,我执行计算,然后刷新适当的UI元素并停止UIActivityIndi​​catorView。

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

在iPad上,点击表中的项目后,看起来好像该应用程序冻结了。 几秒钟后,数据出现。 (这并不能帮助我测试的iPad是第一代mini,因此速度较慢。)没有活动指示器。

在调试中,我发现viewDidAppear实际上是在视图出现之前调用 除非viewDidAppear方法返回,否则显示什么都不会发生。 我已经在断点处看到了这一点,但是通过在ViewDidAppear的开头和结尾放置NSLog语句,我也确认了没有断点。

因此,这看起来很糟糕; 我想知道我是否可以对我的Segue,View Controller,Navigation Controller或Split View Controller做任何事情,使其表现出我想要的方式?

提前致谢...

ios ipad uisplitviewcontroller viewdidappear
回答

我最终通过添加延迟计算来解决此问题。 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`

        });
    });

并且可能会表现出您想要的效果。