【问题标题】:UIStoryboard Reference and root view controllerUIStoryboard 参考和根视图控制器
【发布时间】:2017-01-12 15:30:35
【问题描述】:

我有一个“主”情节提要,在这个情节提要内我有一个情节提要参考实体,它链接到另一个情节提要“登录”。我注意到,当我尝试使用以下内容访问当前屏幕上的视图时:

[[[[UIApplication sharedApplication]delegate]window]rootViewController]

它返回了“主”情节提要上的视图,但如果我尝试在此视图上推送 UIAlertController,我会收到以下错误:

Warning: Attempt to present <UIAlertController: 0x1839a000> on <ViewController: 0x17633ad0> whose view is not in the window hierarchy!

是否有原因我不能将此视图推到顶部,如果不是,我如何从“登录”情节提要中获取当前显示的实际 uiviewcontroller?

【问题讨论】:

  • 您能描述一下您在哪个情节提要控制器上显示出现错误的警报控制器吗?我的意思是用于呈现的代码行以及该控制器来自哪个故事板?
  • 你想要顶视图控制器吗?

标签: ios objective-c uiviewcontroller uistoryboard uistoryboardsegue


【解决方案1】:

请用这个

 -(id)getTopViewController{


               UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;

                while (topController.presentedViewController) {
                    topController = topController.presentedViewController;
                }
                if (![topController isKindOfClass:[NSNull class]]) {

                    return topController;
                }



        }

像这样使用这个方法

 UIViewController *viewOb = [self getTopViewController];

使用 viewOb 来呈现ViewController。

【讨论】:

    【解决方案2】:

    如果您从您的viewDidload 呈现UIAlertController,那么它可能会发生这样的情况,因为当时正在加载视图时,在完全加载之前它不在 Windows 层次结构中。

    第二件事你必须在最顶层的视图控制器上显示UIAlertController,

     [self presentViewController......];
    

    不在 Windows rootViewController 上。所以,这取决于你如何做到这一点。

    【讨论】:

    • 嗨,Ketan,感谢您提供的信息。我将我的代码重新编写给用户委托,以将相应的行为推送到实例化视图的视图控制器中,这似乎有效。我仍然想知道为什么我无法访问当前可见的视图,因为 rootviewcontroller 应该告诉我当前显示的 uiviewcontroller,从这里我可以创建一个变量,然后使用该变量来呈现视图控制器。
    • in viewDidload 视图没有加载,在完成该方法后,视图完全加载到窗口上,因此之后调用 viewWillAppear 或 viewDidAppear,此时 viewController 的视图是已经加载到window
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多