2016-11-08 17 views
1

私のストーリーボードには3つのシーンがあります。私の最初のView ControllerはNavigation Controllerであり、次にUI ViewController(View Controller a)への関係のルートビューコントローラがあり、次にViewControllerのボタンから3番目のViewController(View Controller b)へのPush Segueがあります。シーン。私はプッシュ・セグに識別子を与えました。Swift 3 - Segueの準備

:私はこのコードを実行すると、コントローラAのボタンを押すと、しかし、私は次のエラーを取得する

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

:今、私はそうのような第二ビューコントローラ(ビューコントローラA)で私のセグエを準備しようとしています

致命的なエラー:暗黙的にアンラップされたオプション(nilを含む)をブリッジしようとしました

私は間違っていますか?

+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が暗黙のうちに開封されたように、オプションとして定義されていることでなければなりません。なぜなら!の、detailItemにそれを割り当てるときに、それがnilの場合

その場合var barcodeInt:Int!

は、SWIFTがかかるあなたのそこには無限の価値があり、それを逆参照するという言葉です。これはランタイムエラーです。最良の方法は、可能であれば!のコードを書くことを避けることです(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 

} 
関連する問題