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

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

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

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

Q&A

解決済

1回答

1096閲覧

swiftのdeligate処理についてです。

Hayato1201

総合スコア220

Swift

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

0グッド

0クリップ

投稿2018/09/01 01:23

編集2018/09/01 10:48

以下のURLのコードのDemoを使用しています。
https://github.com/shin8484/PopupWindow

こちらの、RegisterPopupViewという画面下からcontainer View が出てくるものを編集しようとしています。RegisterPopupViewクラスから、そのcontainer Viewの上にあるボタンが押された時の処理内に、VCにあるメソッドを実行したいです。そのためにはdeligate処理が必要という事でそれを行おうとしています。呼ばれる側MainpageViewControllerと呼ぶ側RegisterPopupViewは以下の様になっています。(関係ない部分は多様省略しています)

swift

1class MainpageViewController: UIViewController { 2 3 @IBOutlet private weak var registerPopupView: RegisterPopupView! 4 5func test(){ 6 7//do something 8} 9 10override func viewDidLoad() { 11 super.viewDidLoad() 12 13 registerPopupView.delegate = self //Unexpectedly found nil while unwrapping an Optional value 14}

swift

1class RegisterPopupView: UIView, PopupViewContainable, Nibable { 2 3 weak var delegate: MainpageViewController? 4 5 6 @IBOutlet weak var containerView: UIView! { 7 didSet { 8 containerView.layer.masksToBounds = true 9 } 10 } 11 12 @IBAction func didTapRegisterButton() { 13 14 15 16 delegate?.test() 17 18 registerButtonTapHandler?() 19 20 }

registerPopupView.delegate = self でUnexpectedly found nil while unwrapping an Optional value が出るのはregisterPopupView.delegateがnilだからで、MainpageVCの方で、@IBOutlet private weak var registerPopupView: RegisterPopupView!のアウトレット接続が必要な様ですが、その方法が分かりません。どれと接続すれば良いのでしょうか?container Viewやその上のViewでしょうか?しかしいずれも接続できません。何が問題でしょうか?

ーーーーー追記ーーーーーーーーーー
「RegisterPopupViewController」のインスタンスを生成した際RegisterPopupViewController.delegateにVCのインスタンスを渡す、の部分ですが、要は以下の

swift

1let hoge = Hoge() 2let piyo = Piyo() 3hoge.delegate = piyo

の部分ですよね?今回代理人クラスはVCなのでこれらはどこでインスタンス化されるのでしょうか??いわゆる代理人を指定の部分だけよくわからないです。最初はregisterPopupView.delegate = selfの様にしてviewDidLoad()の中でやろうとしていたわけですが、これだとregisterPopupViewがインスタンス化されてなくてnilになってしまうという事でした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Gitのコードですと、ポップアップのやつは「RegisterPopupViewController」ないで生成しているようですね。
「RegisterPopupViewController.swift」の「private let registerPopupView = RegisterPopupView.view()」の部分です。
「RegisterPopupView.view()」は「Nibable」のプロトコル内で定義されているメソッドで、この中の処理でxibファイルから「RegisterPopupView」のインスタンスを生成しているようです。
そのため、「RegisterPopupView」ないでハンドリングしたイベントを「MainpageViewController」クラスまで返すのであれば、「RegisterPopupView」→「RegisterPopupViewController」→「MainpageViewController」という流れるになるかと思います。

container Viewでボタンがタップされた際のイベントは、「RegisterPopupViewController」ないですでにハンドリングしているので、この辺りを改修しては如何でしょうか?
・registerPopupView.closeButtonTapHandler
・registerPopupView.registerButtonTapHandler

投稿2018/09/01 02:46

Tomochika_Tomo

総合スコア166

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

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

Hayato1201

2018/09/01 03:50 編集

回答感謝いたします!! RegisterPopupViewControllerの、registerPopupView.registerButtonTapHandler{}の中から呼び出したいVC内のメソッドtest()を呼ぶという事でしょうか?しかしその場合どの様にVC内のメソッドにアクセスできるのでしょうか?
Tomochika_Tomo

2018/09/01 07:39

考え方はHayato1201さんが当初やろうとしていたdelegateの方針と一緒です。 また、delegateで実装するにあたってはprotocolを宣言して実装する方が良いかと思いますので、delegateについてはもう少し調べて見た方が良さそうだなーと思います。 ※今の実装ですと、単純に特定のViewControllerのインスタンスをプロパティとして保持しているという状態でしかないため、delegateの考え方と少し違うかなと感じています。 https://qiita.com/mochizukikotaro/items/a5bc60d92aa2d6fe52ca 添付したURLの 以下の部分がVCに委譲したいメソッドの定義となります。 protocol Mochi { func sayHello() -> String } class Hogeは今回でいうとRegisterPopupViewControllerに置き換えて考えていただければと思います。 その中の「var delegate: Mochi!」は委譲したいVCのインスタンスを渡す変数となります。 ※現状では「 weak var delegate: MainpageViewController?」と宣言いただいている部分です。 あと必要なのは、以下となります。 ・処理を委譲したいVCの宣言部にてprotocolの継承を宣言する。 ・処理を委譲したいVC内にsayHello()のメソッドを定義し、処理を記載する。 ・「RegisterPopupViewController」のインスタンスを生成した際にRegisterPopupViewController.delegateにVCのインスタンスを渡す。 ・registerButtonTapHandlerの処理内でdelegate.sayHello()で処理を呼び出す。
Hayato1201

2018/09/01 10:50

丁寧な回答でありがたいです! 何度も申し訳ないですが、分からない部分を質問の方に追記させていただいたので返信いただけるとありがたいです!!
Hayato1201

2018/09/01 12:43

すみません、やはりできました! VC内でvar registerPopupViewController = RegisterPopupViewController()の様にインスタンス化してviewDidLoad()の中で registerPopupViewController.delegate = selfとしました。 ありがとうございました!
Tomochika_Tomo

2018/09/01 16:03

解決したようで良かったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問