iOS Swift3检查ViewController对象的nil值

let viewControllers: [UIViewController] = self.navigationController!.viewControllers for VC in viewControllers { if (VC.isKind(of: HomeViewController.self)) { bScreen = true self.navigationController?.popToViewController(VC, animated: true) } } if bScreen == false { let homeVC = HomeViewController() self.navigationController?.pushViewController(homeVC, animated: false) } 

我循环通过导航控制器arrays移动到HomeViewController.above代码工作正常。有些时候我正在崩溃,因为“致命的错误:在打开一个可选值时意外地发现了nil。”我知道这次崩溃的原因。请帮我怎么样检查视图控制器对象的nil值。任何帮助将不胜感激。谢谢提前

使用此代码。 这对你有帮助。

 let viewControllers: [UIViewController] = self.navigationController!.viewControllers for VC in viewControllers { if (VC.isKind(of: HomeViewController.self)) { bScreen = true self.navigationController?.popToViewController(VC, animated: true) break; } } if bScreen == false { let homeVC = HomeViewController() self.navigationController?.pushViewController(homeVC, animated: false) } 

– 斯威夫特3 –

 for vc in (self.navigationController?.viewControllers)! { if vc is HomeViewController { _ = self.navigationController?.popToViewController(vc, animated: true) } } 
 let getCurrentVCIndex = self.navigationController?.viewControllers.indexOf({ (viewController) -> Bool in if let _ = viewController as? HomeViewController { return true } return false }) if getCurrentVCIndex { let HomeVC = self.navigationController?.viewControllers[getCurrentVCIndex!] as! HomeViewController self.navigationController?.popToViewController(HomeVC, animated: true) } else { // use push } 

或使用像

 if let HomeVC = self.navigationController?.viewControllers.filter({$0 is HomeViewController}).first { self.navigationController?.popToViewController(HomeVC!, animated: true) }else { // use push } 

切勿直接使用! 直到你确定它不会是零。 替换您的代码如下。 您可以使用if letguard let来解包选项。

  if let viewControllers: [UIViewController] = self.navigationController?.viewControllers { for VC in viewControllers { if (VC.isKind(of: ViewController.self)) { bScreen = true self.navigationController?.popToViewController(VC, animated: true) } } if bScreen == false { let homeVC = ViewController() self.navigationController?.pushViewController(homeVC, animated: false) } } else { // IF VC is nil } 

如果允许/保护可选值以避免崩溃,最好使用它。

 if let viewControllers: [UIViewController] = self.navigationController.viewControllers{ for VC in viewControllers { if (VC.isKind(of: HomeViewController.self)) { bScreen = true self.navigationController?.popToViewController(VC, animated: true) } } if bScreen == false { let homeVC = HomeViewController() self.navigationController?.pushViewController(homeVC, animated: false) } } 

根据您的代码,在循环中,如果导航堆栈包含相应的视图控制器,则会弹出相应的页面。 但问题是如果同一个视图控制器出现两次,将导致同时执行循环。 这可能会导致崩溃。 所以在poptoviewcontroller之后添加一个中断将避免这个问题。 请检查以下代码,对您有所帮助。

  if (VC.isKind(of: HomeViewController.self)) { bScreen = true self.navigationController?.popToViewController(VC, animated: true) break }