在不同的 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 上呈现视图控制器的主要内容,如果未能解决你的问题,请参考以下文章