2016-05-12 13 views
0

ベローが私のコードです。私はこれらのボタンの1つを押している間は、常に値をアンラップしないというエラーが発生しています。それはなぜ起こるのですか?デリゲートの作成中にnilを取得する

ContainerViewController:

protocol ButtonTitleSenderProtocol: class { 
      func leftButtonTitle(title:String) 
      func rightButtonTitle(title:String) 
    } 

    class ContainerViewController: UIViewController { [...] 
      weak var delegate: ButtonTitleSenderProtocol? 

      @IBAction func leftButtonPressed(sender: AnyObject) { 
       let myTitle = myLeftButtonOutlet.currentTitle! 
       delegate!.leftButtonTitle(myTitle) 
      } 

      @IBAction func rightButtonPressed(sender: AnyObject) { 
       let myTitle = myRightButtonOutlet.currentTitle! 
       delegate!.rightButtonTitle(myTitle) 
      } 
    } 

MyChatViewController:

class MyChatViewController: ChatViewController, ButtonTitleSenderProtocol{ 
    [...] 
      override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
       let myVC = ContainerViewController() 
       myVC.delegate = self 
      } 

      func leftButtonTitle(title: String) { 
       addNewMessage(title) 
      } 

      func rightButtonTitle(title: String) { 
       addNewMessage(title) 
      } 
    } 
+0

! **それをしないでください**。 'currentTitle'は' nil'か 'delegate'です。コードをデバッグして、条件付きで展開する必要がある場所を確認します。 – luk2302

+0

'prepareForSegue(segue:sender:)'では、新しい 'ContainerViewController'オブジェクトを作成していますが、それは普通でしょうか?あなたは 'segue.destinationViewController'を使用しませんか? – Larme

+0

デフォルトの初期化子 '()'で 'UIViewController'を作成することはできません。指定されたイニシャライザで初期化された** real **オブジェクトへの参照がSegueから、またはInterface Builderでコンセントで参照される必要があります。 – vadian

答えて

0

問題はあなたのprepareForSegueであり、これを試してみてくださいsegue.destinationViewController

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    let myVC = segue.destinationViewController as! ContainerViewController 
    myVC.delegate = self 
} 
0

経由ContainerViewController'sオブジェクトのオブジェクトを作成します。あなたは、実際に新しいインスタンスを作成し、代わりに実際に

MyChatViewControllerと呼ばれる1つのインスタンスにデリゲートを割り当てている:あなたはアンラップを強制するので

class MyChatViewController: ChatViewController, ButtonTitleSenderProtocol{ 
    [...] 
      override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

       if let myVC = segue.destinationViewController as?ContainerViewController 
       { 

      myVC.delegate = self 


      } 



      } 

      func leftButtonTitle(title: String) { 
       addNewMessage(title) 
      } 

      func rightButtonTitle(title: String) { 
       addNewMessage(title) 
      } 
    } 
関連する問題