2016-11-08 55 views
1

我有3个场景在我的故事板。我的初始视图控制器是一个导航控制器,然后有一个关系根视图控制器到UI ViewController(视图控制器a),然后我有一个推从视图控制器中的按钮到第三个ViewController(视图控制器b)现场。我已经推出了一个标识符。现在,我想,像这样准备我的第二个视图控制器赛格瑞(视图控制器):斯威夫特3 - 准备赛格

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "HistorySegue" { 
      if let viewController = segue.destination as? HistoryController { 
       viewController.detailItem = barcodeInt as AnyObject 
      } 
     } 
    } 

然而,当我运行此代码并将其推入控制器的按钮,我得到以下错误:

致命错误:尝试桥接包含零的隐式解包可选

我在做什么错?

+1

什么'barcodeInt'?请详细说明。 – Lumialxk

+0

'detailItem'和'barcodeInt'的类型是什么? –

回答

2
Replace your code with. It will not crash atleast. 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "HistorySegue" { 
      if let viewController = segue.destination as? HistoryController { 
       if(barcodeInt != nil){ 
       viewController.detailItem = barcodeInt as AnyObject 
       } 
      } 
     } 
    } 
0

它必须是barcodeInt被定义为隐含展开可选,如:

var barcodeInt:Int!

在这种情况下,如果是零,因为!它分配给detailItem时,迅速把你的因此,在那里有一个非零值,并将其解引用。这是一个运行时错误。您最好的选择是避免在您编写的代码中使用!(例如,保留Apple生成的IBOutlets代码即可),并在返回到隐式解包选项前尽可能多地了解可选项。然后,仍然谨慎使用它们。您的情况

更安全的代码:

if let viewController = segue.destination as? HistoryController, 

    guard let barcodeInt = barcodeInt as? AnyObject else { 
     NSLog("Error: expected barcodeInt to be set") 
     return 
    } 

    viewController.detailItem = barcodeInt 

}