我有一个类似的故事板设置:
家用导航控制器-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的内容。
关于如何使它工作的任何建议?
谢谢。
答案 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)
}