ios - 避免再次初始化相同的故事板
问题描述
configureViewController()
每次调用每个 ViewControllersviewWillAppear()
方法时都会调用该方法;因此,我想知道如何避免多个地方初始化相同viewcontroller
的相同storyboard
。
在这种情况下,最好的方法是什么?
AppDelegate.swift
private func loginVC() -> UIViewController {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
return storyboard.instantiateViewController(withIdentifier: "LoginVC")
}
private func homeVC() -> UIViewController {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
return storyboard.instantiateViewController(withIdentifier: "HomeVC")
}
public func configureViewController() {
if isLoginRequired() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let navigationController = storyboard.instantiateInitialViewController() as! UINavigationController
navigationController.viewControllers = [loginVC()]
keyWindow?.rootViewController = navigationController
}
}
解决方案
希望我能正确理解你的意思。
我建议创建一个属性来存储viewController
,如果它已经存在则返回它,或者在它不存在时创建一个。
例如:
var nav: UINavigationController?
public func configureViewController() {
if isLoginRequired() {
if let nav = self.nav {
keyWindow?.rootViewController = nav
} else {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let navigationController = storyboard.instantiateInitialViewController()
as! UINavigationController
navigationController.viewControllers = [loginVC()]
nav = navigationController
keyWindow?.rootViewController = navigationController
}
}
}
更新:
如果我们想避免一次又一次地初始化 UIStoryboard,我们可以使用相同的想法存储 UIStoryboard。
AppDelegate.swift
var keyWindow: UIWindow?
let storyboard = UIStoryboard(name: "Main", bundle: nil)
private func loginVC() -> UIViewController {
return storyboard.instantiateViewController(withIdentifier: "LoginVC")
}
private func homeVC() -> UIViewController {
return storyboard.instantiateViewController(withIdentifier: "HomeVC")
}
public func configureViewController() {
if isLoginRequired() {
let navigationController = storyboard.instantiateInitialViewController() as! UINavigationController
// replace the viewControllers in navigationControllers with a whole new stack
// initialize a new loginVC and put it in the stack
navigationController.viewControllers = [loginVC()]
// you can print and check the memory address of the viewController in the navigationController
print(navigationController.viewControllers)
keyWindow?.rootViewController = navigationController
keyWindow?.makeKeyAndVisible()
}
}
因此,我想知道如何避免多个地方初始化同一个故事板的同一个视图控制器。
我对“避免初始化同一个故事板的同一个 viewController”有点困惑,但是如果你的意思是“确保我们创建一个新的 loginVC 而不是使用旧的 / 现有的,因为我们希望用户回到条目点并登录”,然后您可以从打印声明中看到这loginVC()
是一个全新的。
附加: 以上答案基于低于 13.0 的 iOS 版本。在iOS13.0+中,UIWindow的处理建议移到SceneDelegate。
推荐阅读
- vb.net - 将光标/插入符号发送到 RichTextBox 中的下一段
- html - 为什么文本装饰在这种情况下不起作用?
- testing - 有没有办法在 Robot Framework 的 If 条件中设置变量?
- javascript - JavaScript:通过在标准 JS array.sort 的自定义比较函数中暂停来等待来自用户(比较 2 张图片)的 onclick 事件?
- java - 在 liquibasev 中禁用删除表
- c++ - 通过引用传递 std::istream 和 std::ostream 以在函数内使用
- html - 我在反应中的 CSS 类正在影响不同的页面
- javascript - 承诺 {
尽管使用了 async/await,但仍返回 - javascript - 反应数组中的元素。警告:React.createElement:类型无效
- laravel - npm 运行成功但终端进程停止(系统限制)