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

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

ただいまの
回答率

90.83%

  • Swift

    6311questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 95

waya

score 14

こんばんは。
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)
    }
}

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2018/06/01 09:31

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

    キャンセル

  • waya

    2018/06/01 11:27

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

    キャンセル

回答 2

checkベストアンサー

+2

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

protocol RegisterButtonDelegate: class {
    //buttonを押した際のdelegateメソッド の記述
    func registerTapButton(message: String)
}

//AAAController.swift

class AAAController: UIViewController {

    weak var delegate: RegisterButtonDelegate?

    @IBAction func registerButton(_ sender: Any) {

        delegate?.registerTapButton(message: "Message from AAA")
        navigationController?.popViewController(animated: true)
    }
}

//BBBController.swift

class BBBController: UIViewController, RegisterButtonDelegate {

    var sendMessage: String?

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "Storyboardで設定したIdentifier",
            let aaa = segue.destination as? AAAController {
            aaa.delegate = self
        }
    }

    // MARK: - RegisterButtonDelegate

    func registerTapButton(message: String) {

        self.sendMessage = message
        print(self.sendMessage ?? "")
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/01 11:36

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

    キャンセル

  • 2018/06/01 12:41

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

    キャンセル

  • 2018/06/01 15: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

    キャンセル

  • 2018/06/01 21:01

    参考にしているページはUIViewをViewControllerに乗せてボタンタップ時にDelegateメソッドを呼んでいるので、今回の画面遷移するパターンとは少し違います。

    Segueを使っているのでしたらprepare(for segue: UIStoryboardSegue, sender: Any?)でdelegateを設定してください。

    回答を編集しましたのでそちらを見てみてください。

    キャンセル

  • 2018/06/05 00:54

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

    キャンセル

+1

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

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

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

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

class BBBController: UIViewController, RegisterButtonDelegate {
     var sendMessage: String?

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? AAAController {
            vc.delegate = self
        }
    }

   〜略〜

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/05 00:55

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

    キャンセル

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

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    キーボードが閉じない

    Main.storybodrdにUITextFieldを配置しています。これにキーボードで文字を入力した後、キーボードを閉じたいのでTextFieldと接続しているクラスをプロトコ

  • 解決済

    swift UISwipeGesture

    今同じViewControllerにScrollViewで3画面あってその3画面にImageViewが1枚づつあります。 その3枚目のImageViewにUISwipeGes

  • 解決済

    異なるクラスにあるプロパティのテキストを書き映す

    前提・実現したいこと クラスAにあるテキストをクラスBに表示させたい。 発生している問題・エラーメッセージ 思い通りにテキストを代入できない。 該当のソースコード

  • 解決済

    pickerView 内の文字の色を変えたい

    pickerView内の文字の色とサイズを変更したいのですがウェブで調べても出てこなかったためここで質問させていただきます。 storyBoardの編集でそれは可能でしょうか

  • 解決済

    NavigationBarの戻るボタンの連打防止

    前提・実現したいこと NavigationBar <Backボタンの連打防止 発生している問題・エラーメッセージ A->B->Cへ画面遷移した後 C画面にて表示されているNav

  • 解決済

    iOSでNavigationBarの中央に画像を表示したい

    現在iOSでアプリ作成を行なっており 要件として「ヘッダー部分の中央にはアプリのロゴを常に表示したい」といったものがあります。 色々試してみたもののうまくいかずで困っております

  • 解決済

    navigationbarの戻るボタンでの遷移後にdismissが動作しない

    全ての画面において、ホームボタンを押下するとモーダルを閉じ、一番最初の画面に戻る処理を実装したいです。 通常の進行方向で遷移している場合は正しく動作しますが、 navigati

  • 解決済

    子VCから親VCへのデータ移行

    こんにちは。 親VC上においた子VC(containerView)からのデータを戻す動作についての質問です。 子VCはEmbed SegueでpageViewControllerに

同じタグがついた質問を見る

  • Swift

    6311questions

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