过渡到根视图控制器时遇到问题

时间:2019-04-12 14:33:29

标签: ios swift

我有一个类似的故事板设置:

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

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

谢谢。

2 个答案:

答案 0 :(得分:1)

您应该声明这两者中的第一个是可见的,因此,如果我们假设首页是向用户显示的第一个,则按设置,您应该像这样显示它

@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)
}

每次显示视图控制器时,该视图控制器都会显示在当前显示的视图控制器上方,并且会覆盖该视图控制器,但不会删除并取消分配第一个视图控制器。

答案 1 :(得分:0)

您应该只展示一个导航控制器,我认为它应该是SettingViewController

@IBAction func SettingButtonTapped(button: UIButton) {
    var navController: AppStoryboard.Main.instance.instantiateViewController(withIdentifier: "SettingNavController") as? UINavigationController

    currentViewController?.present(navController!, animated: true, completion: nil)
}

但是在homeButtonTapped中,您应该解雇控制器

@IBAction func homeButtonTapped(button: UIButton) {
   self.navigationController?.dismiss(animated: true, completion: nil)
}