首页 > 解决方案 > 转换到根视图控制器的问题

问题描述

我有一个这样的故事板设置:

家庭导航控制器 - 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的内容。

关于如何使它工作的任何建议?

谢谢。

标签: iosswift

解决方案


您应该首先声明两者中的哪一个是可见的,因此如果我们假设 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)
}

每次您呈现视图控制器时,它都会显示在当前显示的视图控制器上方并覆盖它,但第一个视图控制器不会被删除和释放。


推荐阅读