ios - 转换到根视图控制器的问题
问题描述
我有一个这样的故事板设置:
家庭导航控制器 - VC1 - VC2 - VC3 - VC4
设置导航控制器 - VC1 - VC2 - VC3
要在主屏幕和设置屏幕之间切换,我在设置 VC1 中有一个主页图标/按钮;以及 Home VC1 中的设置图标/按钮。但我无法让这个过渡正常工作。
首先我尝试了这段代码。
@IBAction func homeButtonTapped(button: UIButton) {
var navController: AppStoryboard.Main.instance.instantiateViewController(withIdentifier: "HomeNavController") as? UINavigationController
currentViewController?.present(navController!, animated: true, completion: nil)
}
//... similar code for settingsButtonTapped
它工作正常。但这会创建多个视图控制器实例(检查调试内存图)。假设我在 Home VC1 和 Settings VC1 之间来回切换 5 次,我看到每个视图控制器有 5 个实例。
然后我尝试了这个。
@IBAction func homeButtonTapped(button: UIButton) {
var navController: AppStoryboard.Main.instance.instantiateViewController(withIdentifier: "HomeNavController") as? UINavigationController
window?.rootViewController = navController!
}
//... similar code for settingsButtonTapped
这解决了多个实例的问题。但它弄乱了我拥有的自定义动画弹出窗口。如果我从不点击主页或设置按钮,弹出窗口工作正常。但是,如果我单击一次按钮,从那时起弹出窗口将无法正确显示。假设我从 VC1 转到 VC2,然后在 VC2 中打开一个弹出窗口。弹窗出现了,但背景并没有像往常那样变灰,我可以清楚地看到VC2的内容,后面我也可以看到VC1的内容。
关于如何使它工作的任何建议?
谢谢。
解决方案
您应该首先声明两者中的哪一个是可见的,因此如果我们假设 Home 是第一个向用户显示的,则按下设置,您应该像这样显示它
@IBAction func settingsButtonTapped(button: UIButton) {
let navController = // Instantiate your settings controller
present(navController!, animated: true, completion: nil)
}
然后,如果您想返回主视图控制器,您应该像这样关闭设置视图控制器:
@IBAction func homeButtonTapped(button: UIButton) {
presentingViewController?.dismiss(animated: true, completion: nil)
}
每次您呈现视图控制器时,它都会显示在当前显示的视图控制器上方并覆盖它,但第一个视图控制器不会被删除和释放。
推荐阅读
- php - 显示为 WooCommerce 产品设置的所有产品属性的简码
- css - 在表响应表的@click事件上更改css类
- php - php搜索查询仅显示确切结果
- git - 为什么当我回到 GIT 中的上一个分支时文件夹没有被删除
- java - 如何解决 pom 类型的 Maven 依赖项?
- jquery - 是否可以使用 jquery 插入 VueJs 组件?
- javascript - 如何从 Firestore 中检索数组并将其输出到 HTML 表中
- docker - 通过 Docker 登录气流的默认用户名和密码是什么?
- haskell - 安装可执行文件时硬编码 datadir 路径
- c++ - 如何在 SML 状态或状态机中添加/初始化成员?