Ios 避免再次初始化同一情节提要

Ios 避免再次初始化同一情节提要,ios,swift,Ios,Swift,configureViewController()方法每次调用每个ViewControllersviewwillbeen()方法时都会调用;因此,我想知道如何避免在多个地方初始化同一情节提要的同一视图控制器 在这种情况下,最好的方法是什么 AppDelegate.swift private func loginVC() -> UIViewController { let storyboard = UIStoryboard(name: "Main", bundle:

configureViewController()
方法每次调用每个ViewControllers
viewwillbeen()
方法时都会调用;因此,我想知道如何避免在多个地方初始化同一
情节提要的同一
视图控制器

在这种情况下,最好的方法是什么

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
  }
}
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
,如果它已经存在,则返回它,或者在它不存在时创建一个属性

例如:

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

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

我对“避免初始化同一故事板的同一个viewController”有点困惑,但如果您的意思是“确保我们创建一个新的loginVC,而不是使用旧的loginVC,因为我们希望用户返回入口点并登录”,那么您可以从print语句中看到,
loginVC()
是一款全新的产品

附加:
以上答案基于低于13.0的iOS版本。在iOS13.0+中,建议将UIWindow的处理移到SceneDelegate。

在我的代码中,我已经调用了三次相同的东西:
让storyboard=UIStoryboard(name:“Main”,bundle:nil)storyboard.InstanceeviewController(标识符为:“xxx”)
但是您正在初始化不同的viewController吗?或者你的意思是你不想多次初始化UIStoryboard?我不想一次又一次地初始化故事板。顺便说一下,在下面的一行
keyWindow?.rootViewController=nav
,什么都没有发生,因为
nav
保存了所有的viewcontroller堆栈,所以每当isLoginRequired==true时,您都需要一个新的navgiationController堆栈。然后,也许我们应该清除当前navigationController中的堆栈,初始化一些新的viewController并再次将它们添加到堆栈中。