質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

9109閲覧

swift4 delegateメソッド が呼ばれない件について

waya

総合スコア20

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2018/05/31 14:32

編集2018/06/01 02:25

こんばんは。
swiftにてios開発を始めたばかりの者です。
自作でdelegateの処理を書いたのですが、メソッドが実行されません。

具体的には、
ボタンを押した際に、通知をして通知先(BBBController)に
AAAControllerで持っている値をBBBControllerに送り、その後navigationbarを一つ前(BBBControllerの画面)に戻す
というような処理を行いたいと思っています。

以下の2つのコードを書いて
コンソールを確認しながら動かしているのですが,registerTapButton()のメソッド が動いていないようです。

書いたコードは以下の通りです。

//AAAController.swift protocol RegisterButtonDelegate { //buttonを押した際のdelegateメソッド の記述 func registerTapButton() } class AAAController: UIViewController { weak var delegate: RegisterButtonDelegate? override func viewDidLoad(){ 略 } 〜略〜 @IBAction func registerButton(_ sender: Any) { let nav = self.navigationController! let bbbController = nav.viewControllers[nav.viewControllers.count - 2] as! BBBViewController //このmessegeをbbbControllerに送りたい。 bbbController.sendMessage = "aaaa" //delegateメソッド の実行(brakepointで確認したらnilになっていました) self.delegate?.registerTapButton() //navigationbarのときの画面戻る動作 self.navigationController?.popViewController(animated: true) } }
//BBBController.swift class BBBController: UIViewController, RegisterButtonDelegate { var sendMessage: String? over func viewDidLoad() { super.viewDidLoad() let aaaController: AAAController? = AAAController() aaaController?.delegate = self }    〜略〜     func registerTapButton() { print("動作確認") print(self.sendMessage) } }

アドバイスどうぞよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/06/01 00:31

BBB → AAAはどうやって遷移しているのでしょうか?あと、delegate変数をどのように定義しているか書いて下さい。
waya

2018/06/01 02:27

delegate変数を追加しました。BBB -> AAAはtableviewのセルをタップした時にsegueで繋いで表示しています。
guest

回答2

0

ベストアンサー

Delegateの書き方が正しくないですね、以下の様にすると動くと思います。
参考URL: プロトコルとデリゲートのとても簡単なサンプルについて

swift

1protocol RegisterButtonDelegate: class { 2 //buttonを押した際のdelegateメソッド の記述 3 func registerTapButton(message: String) 4} 5 6//AAAController.swift 7 8class AAAController: UIViewController { 9 10 weak var delegate: RegisterButtonDelegate? 11 12 @IBAction func registerButton(_ sender: Any) { 13 14 delegate?.registerTapButton(message: "Message from AAA") 15 navigationController?.popViewController(animated: true) 16 } 17} 18 19//BBBController.swift 20 21class BBBController: UIViewController, RegisterButtonDelegate { 22 23 var sendMessage: String? 24 25 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 26 if segue.identifier == "Storyboardで設定したIdentifier", 27 let aaa = segue.destination as? AAAController { 28 aaa.delegate = self 29 } 30 } 31 32 // MARK: - RegisterButtonDelegate 33 34 func registerTapButton(message: String) { 35 36 self.sendMessage = message 37 print(self.sendMessage ?? "") 38 } 39} 40

投稿2018/05/31 21:39

編集2018/06/01 12:02
_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

waya

2018/06/01 02:36

ご回答ありがとうございます。 つまり、私の記法との違いはAAAの呼び出しをViewDidAppear内にて行うという認識でよろしいでしょうか?
_Kentarou

2018/06/01 03:41

いや、それ以外も結構変えてますよ、、、ViewDidAppearに変えたのは画面表示前に遷移していたので移しただけです。
waya

2018/06/01 06:59

失礼なコメントをしてしまい、すみません。 まずはじめにdelegate変数の定義を質問に掲載し忘れていたようです。 ViewDidAppear内にてAAAControllerを呼び出すとAAAにて表示予定の値がnilになり動きが停止してしまいます。(AAAControllerを呼び出した際に(BBB -> AAAの遷移がセルの状態を受け取ってAAAにて画面を表示しているため) そのため_Kentarouさんの書いたコードをviewDidLoadにて書き換え、delegateメソッド の呼び出し部分を self.delegate?.registerTapButton(message: "Message from AAA")に変更したのですがやはり動作しません。 また、ViewDidAppearを使うのであれば、Delegateを用いずにAAAから送った値をその場で表示すればよいと思ったのですがどうなんでしょうか。 ちなみにDelegateはこちらのページを参考に書いています。 https://qiita.com/sachiko-kame/items/d8a16148e9ed70074c78
_Kentarou

2018/06/01 12:01

参考にしているページはUIViewをViewControllerに乗せてボタンタップ時にDelegateメソッドを呼んでいるので、今回の画面遷移するパターンとは少し違います。 Segueを使っているのでしたらprepare(for segue: UIStoryboardSegue, sender: Any?)でdelegateを設定してください。 回答を編集しましたのでそちらを見てみてください。
waya

2018/06/04 15:54

なるほど・・・・非常に納得しました。 詳しいご回答ありがとうございました。ありがとうございます!
guest

0

BBB→AAAへの遷移はsegueを利用しているとのことですが、その場合delegateのセットの仕方に問題があるようです。

BBBControllerのviewDidLoad内で以下の様にされていますが、
この場合、遷移先のAAAControllerとは別のAAAControllerのインスタンスを生成してdelegateをセットすることになっています。

swift

1 let aaaController: AAAController? = AAAController() //遷移先のAAAとは別モノ 2 aaaController?.delegate = self

以下の様にprepareForSegue内で遷移先のAAAControllerを取得してdelegateをセットすれば遷移先のAAAからdelegateが呼び出せるかと思います。

swift

1class BBBController: UIViewController, RegisterButtonDelegate { 2 var sendMessage: String? 3 4 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 5 if let vc = segue.destination as? AAAController { 6 vc.delegate = self 7 } 8 } 9 10   〜略〜

投稿2018/06/01 08:30

fumiaki

総合スコア56

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

waya

2018/06/04 15:55

詳しい解説ありがとうございます。 納得しました。参考にして開発していきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問