2017-12-05 10 views
0

親ビューコントローラの下部にあるビューコンテナに表示される子ビューコントローラを取得しようとしています。子供のボタンを押すと、「基本VCから押したボタン」がコンソールに表示されますが、「メインVCから押したウォームボタン」は表示されません。メインのView Controllerで呼び出される2番目のメッセージを出力する関数が必要です。ここでは、関連するBasicViewControllerコードは次のとおりです。親内の関数を呼び出さないスウィフトデリゲート

protocol BasicVCDelegate: class { 
    func warmButton() 
} 

class BasicViewController: UIViewController { 
    weak var BasicVCDelegate: BasicVCDelegate? 

    @IBOutlet weak var warmButton: UIButton! 

    @IBAction func warmButton(sender: AnyObject) { 
     print("Button pressed from Basic VC") 
     BasicVCDelegate?.warmButton() 
    } 
} 

そしてViewController.swift

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, BasicVCDelegate { 
    override func viewDidLoad() { 
     pauseButton.isEnabled = false 

     hideAll(); 
     self.basicContainer.isUserInteractionEnabled = true; 
     self.basicContainer.isHidden = false; 

     self.timerLabel.text = String("00:00:00"); 

     eventTable.dataSource = self 
     eventTable.delegate = self 

     loadEvents(event: "timer start") 
     super.viewDidLoad() 
    } 

    // CREATE SEGUEs 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let nav = segue.destination as? UINavigationController, let classBasicVC = nav.topViewController as? BasicViewController { 
      classBasicVC.BasicVCDelegate = self 
     } 
    } 

    // FUNCTIONS FOR BASIC VIEW CONTROLLER TO REFERENCE 
    func warmButton() { 
     print("Warm button pressed from main VC") 
    } 
} 

からEDIT: 以下皆から、ライン(のViewController内のコードの次のセクションが問題を引き起こしているようです)文が呼び出されることはありませんされている場合内:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let nav = segue.destination as? UINavigationController, let classBasicVC = nav.topViewController as? BasicViewController { 
     classBasicVC.basicVCDelegate = self 
    } 
} 

これはおそらく、私の代表団との不慣れとpreparefoによるものですrsegue関数。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let nav = segue.destination as? BasicViewController, let classBasicVC = nav.basicVCDelegate { 
     print("got here!!") 
    } 
} 

FINAL: (まだprint文に到達していない)、一部のユーザーの提案に従って、次で上記のコードを置き換え:

EDIT 2「許可すればする」ということにはどうあるべきかを考え出す助けが必要編集: あなたの助けていただきありがとうございます!いくつかの遊びの後、次のような作業が行われます(アドレス指定時にエラーに変わる警告を除いて、警告付きで暮らすことができます)。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let nav = segue.destination as? BasicViewController, let classBasicVC = nav as? BasicViewController? { 
     classBasicVC?.basicVCDelegate = self 
    } 
} 
+0

のようなデリゲート変数にキャメルケースを使用することをお勧め? –

+0

このチュートリアルはPushで動作しますが、現時点でも動作します:https://iosdevcenters.blogspot.com/2017/11/what-is-protocol-how-to-pop-data-using.html classBasicVCを提示すると、 BasicVCDelegate =自己do。 –

+2

FYI - 小文字で始まる変数とメソッドに名前を付けるのが標準的な方法です。クラス名と構造体名は大文字で始まります。デリゲートプロパティの名前を正しく指定する必要があります。 – rmaddy

答えて

0

それは代わりにあなたの最後の編集済みのコードでこのようになります。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let classBasicVC = segue.destination as? BasicViewController { 
     classBasicVC.basicVCDelegate = self 
    } 
} 
0

あなたはViewControllerを

にボタンのデリゲートを割り当てていない、あなたのViewControllerのにこれを追加viewDidLoad

override func viewDidLoad() { 
    //other code 
    yourButton.BasicVCDelegate = self 
    } 
またそのあなたはそれが実際に呼び出されていることがわかりますあなたは `classBasicVC.BasicVCDelegate = self`にブレークポイントを置く場合は、この basicVCDDelegate

関連する問題