在不同的 UIWindow 上呈现视图控制器

Posted

技术标签:

【中文标题】在不同的 UIWindow 上呈现视图控制器【英文标题】:Present a view controller on different UIWindow 【发布时间】:2014-05-16 16:11:40 【问题描述】:

我需要帮助来解决这个困扰了我两天的问题。假设我有一个处理图像幻灯片的自定义视图控制器,它可用于嵌入视图或通过导航控制器或模式视图呈现它。它还具有可以使用此代码打开的全屏选项

        _fullScreenWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        _fullScreenWindow.backgroundColor = [UIColor blackColor];
        _fullScreenWindow.windowLevel = UIWindowLevelNormal;             
        _fullScreenWindow.rootViewController = self;            
        [_fullScreenWindow makeKeyAndVisible];

我预先存储了原始窗口,以便在退出全屏时恢复其状态。这也调用了方向方法,当它在导航控制器中时不会调用。因此,在全屏模式状态下,有一个选项可以呈现为 uitableviewcontroller,因此理论上我可以使用此代码呈现它。

    UITableViewController *mediaOptionsController = [[UITableViewController alloc] initWithStyle:UITableViewStyleGrouped];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:mediaOptionsController];
    [navController setModalPresentationStyle:UIModalPresentationFormSheet];
    navController.navigationBar.topItem.leftBarButtonItem = dismissButton;
    //mainViewController is the custom view controller, which is on different uiwindow
    [mainViewController  presentViewController:navController animated:YES completion:nil];

但是每当我使用此选项时都会收到此警告,因此无法显示它

警告:尝试在其视图不在窗口层次结构中的 UINavigationController 上呈现 UINavigationController!

知道为什么它不起作用吗?只是让您知道在应用程序委托上设置根控制器是不可行的,因为我直接进入根控制器的视图而不是导航控制器的当前顶视图

【问题讨论】:

为什么要使用两个UIWindows 该错误表明mainViewController 尚未添加到任一窗口。这是真的吗? @Anil,我确实考虑过使用应用程序委托的窗口,但是如果我有一个根控制器导航到点 A->B->…Z,其中 Z 使用自定义控制器但是当我退出全屏时它转到根控制器而不是返回 Z,因此是 2 个 UIWIndows。 @maddy,mainViewController是第2个uiwindow的rootviewcontroller,也是自定义的view controller。我认为它应该出现在我身边,但在节目中并非如此。 我也不认为你需要 2 个窗口。你可以做 self.window.rootViewController = mainViewController 或任何其他你想作为根视图控制器的控制器 【参考方案1】:

不是真正的解决方案,但我通过关闭第二个窗口并设置主窗口键来解决此问题,然后从那里显示选项。只有退出选项,我才能再次制作第二个窗口键。

【讨论】:

在这种情况下没有理由使用两个窗口。您需要解决导航控制器的问题 @Lance 最好为此提供解决方案。相信我,我已经尝试了 1 个窗口,但在还原原始根控制器时它不起作用

以上是关于在不同的 UIWindow 上呈现视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

视图控制器解除动画参数

86UIWindow简单介绍

将 UIViewController 的视图调整为父 UIWindow 的边界

应用程序试图在目标上呈现一个 nil 模态视图控制器

iOS开发UI篇—UIWindow简单介绍

将模态呈现的视图控制器关闭到不同的底层视图控制器