奇怪的行为viewDidAppear没有被调用

时间:2015-10-29 14:39:01

标签: ios debugging viewdidload viewdidappear

我调用一个函数从父视图中打开子视图。

我看到viewDidLoad被调用了。在我的viewDidLoad中没有代码。 奇怪的是,即使我没有更改任何代码,有时也不会调用viewDidAppear:

当然可能有很多原因,但我不知道如何调试。我正在寻找一种方法来找出viewDidLoad完成时进程挂起的位置。

有没有人对我有所暗示或有人知道可能是什么问题?我的意思是有时候它不会有效。 viewDidAppear:是否取决于父母视图或子视图中是否有错误?

func showSubview() {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewControllerWithIdentifier("Subview") as! SubViewController
    self.presentViewController(vc, animated: true, completion: nil)
    //self.showViewController(vc, sender: self);
}

更新 我从一个异步任务调用showSubview,我想这不好。你怎么想,怎么做得更好?是否有任何带有dispatch_async的complition处理程序?

        dispatch_async(backgroundQueue, {
            dosomething_long();
            showSubview();
        })

更新2 问题是,我正在从后台任务打开子视图。我不应该这样做。但问题是如何在后台任务完成时调用子视图。是否有任何dispatch_async调用的完成处理程序?

解决了GANDALF的帮助

我很蠢:-)我应该在主线程中调用子视图:

        dispatch_async(backgroundQueue, {
            dosomething_long();
            dispatch_async(dispatch_get_main_queue(), {
                showsubview();
            });
        })

2 个答案:

答案 0 :(得分:0)

问题是;是之前创建的视图?是从后台重新打开应用程序时导致的吗? 您可以从这里检查生命周期,我认为您的问题就是因为这个而发生的。 iOS 7 - Difference between viewDidLoad and viewDidAppear

答案 1 :(得分:0)

为什么程序计数器可能不进入方法的一个非常明显的原因是应用程序可以在release模式下运行。

现在我们可以看到更新后的问题,这不是原因,并且在background queue发生了用户界面操作。
根据iOS开发指南,所有UI操作都应该在main thread上进行,您应该尝试在主线程而不是background thread上执行该操作。 请尝试以下代码:

dispatch_async(backgroundQueue, {
    dosomething_long();
    dispatch_async(dispatch_get_main_queue(), {     
        showsubview();
    });
 })