【发布时间】:2017-10-06 03:05:23
【问题描述】:
我有几个视图控制器 (UIViewController)。 每个视图控制器都有自己的storyboard。我希望应用程序在从一个视图控制器转换到另一个视图控制器时调用deinit。但它不会。
应用以 HomeViewController 开头。当用户点击按钮 (UIButton) 时,它将转换到 SelectViewController。
class HomeViewController: BasicViewController {
@IBAction func selectTapped(_ sender: UIButton) {
let storyboard = UIStoryboard(name:"Select",bundle:nil)
let controller = storyboard.instantiateViewController(withIdentifier: "SelectView") as! UINavigationController
let viewController = controller.topViewController as! SelectViewController
self.navigationController?.pushViewController(viewController, animated: true)
}
deinit {
print("HOME HAS BEEN REMOVED FROM MEMORY")
}
}
应用离开 HomeViewController 时从不调用 deinit。我想知道这是不是因为它正在推动视图控制器?如果我如下设置视图控制器,应用程序将崩溃。我究竟做错了什么?我从来没有用不同的故事板做过。谢谢。
class HomeViewController: BasicViewController {
@IBAction func selectTapped(_ sender: UIButton) {
let storyboard = UIStoryboard(name:"Select",bundle:nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "SelectView") as! SelectViewController
self.navigationController?.setViewControllers([viewController], animated: true)
}
}
更新 1
我猜就是下面这个。
@IBAction func selectTapped(_ sender: UIButton) {
let storyboard = UIStoryboard(name:"Select",bundle:nil)
let controller = storyboard.instantiateViewController(withIdentifier: "SelectView") as! UINavigationController
self.present(controller, animated: true, completion: nil)
}
更新 2 当 SelectViewController 出现如下时,我也清除了视图控制器堆栈。
override func viewWillAppear(_ animated:Bool) {
super.viewWillAppear(animated)
var navigationArray = self.navigationController?.viewControllers
navigationArray?.removeAll()
}
【问题讨论】:
-
您可以使用从一个故事板到下一个故事板的故事板引用 - 无需在代码中执行此操作
-
@Ashley Mills 感谢您的提示。当他们有自己的故事板时,您可以从一个视图控制器转换到另一个视图控制器而无需编写代码?怎么样?
-
将“故事板参考”拖到您的第一个故事板上 - 将其值设置为与您的第二个故事板上的视图控制器相对应。从您的按钮拖出一个链接到引用。
-
嗯...我对故事板参考一无所知。非常感谢。
-
使用故事板参考可以使应用程序从一个视图控制器过渡到另一个。但我也想知道如何在代码中做到这一点。
标签: ios swift swift3 uinavigationcontroller