親ビューコントローラの下部にあるビューコンテナに表示される子ビューコントローラを取得しようとしています。子供のボタンを押すと、「基本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
}
}
のようなデリゲート変数にキャメルケースを使用することをお勧め? –
このチュートリアルはPushで動作しますが、現時点でも動作します:https://iosdevcenters.blogspot.com/2017/11/what-is-protocol-how-to-pop-data-using.html classBasicVCを提示すると、 BasicVCDelegate =自己do。 –
FYI - 小文字で始まる変数とメソッドに名前を付けるのが標準的な方法です。クラス名と構造体名は大文字で始まります。デリゲートプロパティの名前を正しく指定する必要があります。 – rmaddy