【问题标题】:iOS Swift3 check nil value for ViewController ObjectiOS Swift3 检查 ViewController 对象的 nil 值
【发布时间】:2017-07-20 06:57:09
【问题描述】:
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”而崩溃。我知道这次崩溃的原因。请帮助我如何检查视图控制器对象的 nil 值。任何帮助将不胜感激。在此先感谢

【问题讨论】:

  • 你在用swift 3吗
  • 你在哪一行崩溃了?
  • 是的..它在“self.navigationController?.popToViewController(VC, animated: true)”这一行崩溃
  • 试试这个:- 如果 vc 是 HomeViewController
  • @arunrajesh 我不认为这是可能的,因为如果 vc 为 nil 则它不会进入 if 语句。尝试使用is 而不是kindOf swift 更改其语法。

标签: ios swift


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    最好使用 if let / 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)
            }
    }
    

    【讨论】:

    • 为你的答案添加一些解释,而不仅仅是一个代码 sn-p。
    • 刚刚添加了一个 if let 检查 navigationController 以确保它不是 nil
    • 我知道,但是您应该在答案中输入它,而不仅仅是粘贴代码。
    【解决方案3】:

    永远不要直接使用!,除非你确定它不会是 nil。如下替换您的代码。您可以使用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 的 else 部分在哪里,它的工作方式与原始要求不同
    • 我猜其他部分不是必需的,但仍然取决于代码。
    • @VarunNaharia 如果让条件不包含其他部分。请检查是否让条件文件
    • @VarunNaharia 其他部分不是必需的,但如果有人想添加,则可以像上面那样实现。
    【解决方案4】:
    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
    }
    

    或使用like

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

    【讨论】:

      【解决方案5】:

      -- 斯威夫特 3--

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 这段代码和原代码没有区别,请补充解释为什么你认为它会起作用
        • @VarunNaharia .请仔细查看我在代码中添加中断
        • 我知道,但你应该在答案中输入它,而不仅仅是粘贴代码,如果你仔细检查你的代码,它没有任何功能变化,它将与原始代码完全相同
        • @VarunNaharia。不,每当您运行此代码时,它有时会崩溃。但是如果你添加 break 然后打破循环并且不会发生崩溃。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多