繁体   English   中英

iOS Swift3检查ViewController对象的nil值

[英]iOS Swift3 check nil value for ViewController Object

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

我遍历导航控制器数组移动到HomeViewController。上面的代码运行正常。有时我会崩溃,因为“严重错误:在解开可选值时意外发现nil”。我知道此崩溃的原因。请帮助我检查视图控制器对象的零值。任何帮助将不胜感激。谢谢

-迅捷3-

for vc in (self.navigationController?.viewControllers)! {
     if vc is HomeViewController {
        _ = self.navigationController?.popToViewController(vc, animated: true)
     }
}

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

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)
            }
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 / guard用作可选值时使用,以免崩溃。

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

切勿直接使用! 直到您确定该不会为零为止。 如下所示替换您的代码。 您可以使用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
}

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

 if (VC.isKind(of: HomeViewController.self)) {

                bScreen = true
                self.navigationController?.popToViewController(VC, animated: true)
                break
            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM