窗口层次结构 ios

Posted

技术标签:

【中文标题】窗口层次结构 ios【英文标题】:Window hierarchy ios 【发布时间】:2016-08-26 08:57:54 【问题描述】:

我有一个可能已经回答的问题,但我就是找不到。

我有一个调用一些 web 服务的视图,当结果返回时,我想打开另一个视图来显示结果。在调用 WS 之后,我立即关闭了该窗口。

现在我的问题是,当我尝试使用 presentViewController 打开它时

UIApplication.sharedApplication().keyWindow?.visibleViewController!.presentViewController or
UIApplication.sharedApplication().keyWindow?.visibleViewController!.childViewControllers[0].presentViewController 

如果我访问 rootViewControler 也是如此。

我得到的错误是视图不再在层次结构中,因为它已经调用了 viewWillDisappear。

那么有什么方法可以显示所有视图的视图,不管当前的顶视图是什么?

编辑:

解决方案真的很丑陋和愚蠢。我有一个静态变量,每次调用 viewDidApear 到该视图时都会更改该变量。这样我就有了显示的最后一个视图。我知道这不是好方法,甚至可能不是安全的方法,但我没有任何其他想法。

【问题讨论】:

请显示更多代码。 【参考方案1】:

是的,有一种方法可以将 ViewController 显示在另一个之上,但为此您根本不应该触摸您的窗口。 在您的呼叫完成呼叫后立即在您的视图控制器类中

let viewController = ViewController() //change this to your view controller class that you want to present
self.presentViewController(viewController, animated: true, completion: nil)

【讨论】:

在正常情况下这是可行的,问题是在我称之为这不是 UIViewController 的窗口上,所以我必须获得应用程序的顶视图。【参考方案2】:

使用以下代码调用 Web 服务并在主线程中导航您的视图控制器。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
    // do some background task
    dispatch_async(dispatch_get_main_queue(), ^
        // update UI here
        // navigate your view controllers
        let vc: UIViewController =  (self.storyboard?.instantiateViewControllerWithIdentifier("viewContIdentifire"))!
        self.presentViewController(vc, animated: true, completion: nil)
                           // **OR**
        self.navigationController?.pushViewController(vc, animated: true)

      );
);

使用更方便的方式导航回 VC

// using this navigate your app to root view of ui stack
self.navigationController?.popToRootViewControllerAnimated(true)

// using this line of code navigate to any view        
self.navigationController?.popToViewController(viewContName, animated: true)

// this navigate back to last view
self.navigationController?.popViewControllerAnimated(true)

【讨论】:

问题是我使用不同的navigationControllers,有些被关闭了,所以我仍然必须以某种方式找到最后打开的视图。 使用self.navigationController?.pushViewController(vc, animated: true)会带回选项。 只需使用我发布的上述代码申请,然后您就会了解如何导航。 正如我在评论中写下的答案一样,我没有在 UIViewController 类中进行此调用,所以我不能调用 self,这是我的问题。而且我不能在开始调用时设置父类,因为在调用父类关闭并且应用程序等待 WS 调用结果之后。

以上是关于窗口层次结构 ios的主要内容,如果未能解决你的问题,请参考以下文章

iOS viewWillAppear 错误:“视图不在窗口层次结构中”

Xamarin.Forms 警告:尝试使用 iOS 图像/手势识别器在其视图不在窗口层次结构中的 * 上呈现 *

iOS 视图与视图层次结构(内容根据iOS编程)

如何解决此错误“警告:尝试呈现其视图不在窗口层次结构中”?

层次结构窗口

swift 3 present from appdelegate 错误:警告:尝试显示〜其视图不在窗口层次结构中