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

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

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

Delegatesとは、オブジェクト指向型プログラミングにおいて、あるオブジェクトの操作を一部の他のオブジェクトに代替させる手法のこと。オブジェクトは他のデリゲートに頼って関数を実行することができます。

Swift

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

Q&A

解決済

3回答

1305閲覧

メソッドを経由してデリゲートを設定する方法

YS_

総合スコア21

Delegates

Delegatesとは、オブジェクト指向型プログラミングにおいて、あるオブジェクトの操作を一部の他のオブジェクトに代替させる手法のこと。オブジェクトは他のデリゲートに頼って関数を実行することができます。

Swift

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

0グッド

0クリップ

投稿2019/12/27 01:28

編集2019/12/27 06:17

VIewControllerにTestViewControllerのデリゲート(myDelegate)を設定する際に、
VIewDataのgetViewControllerメソッドを仲介する形式で実現させたいのですが
下記ソースの通り、ViewControllerの topController.myDelegate = self でビルドエラーとなります。

デリゲートの使い方が間違っているのでしょうか?そもそもメソッド(getViewController)で
デリゲートを渡す方法はできないのでしょうか?

VIewController.swift

import UIKit class ViewController: UIViewController,myDelegate{ //ビューデータ読み込み var viewdata = ViewData() override func viewDidLoad() { super.viewDidLoad() var controllers:[UIViewController]=[] let topController = viewdata.getViewController("TEST") topController.myDelegate = self // ←ここでビルドエラー【Value of type 'UIViewController' has no member 'myDelegate’】 controllers.append(topController) ~~~~~~ } func myTest() { ~~~~~~ } }

VIewData.swift

import UIKit class ViewData{ func getViewController(_ text:String)->UIViewController{ switch text{ case “TEST”: let storyboard:UIStoryboard = UIStoryboard(name:"Main",bundle:nil) let TestView = storyboard.instantiateViewController(withIdentifier: "Test") as! TestViewController return TestView default: } } }

TestViewController.swift

import UIKit class TestViewController:UITableViewController{ var myDelegate:myDelegate? override func viewDidLoad() { super.viewDidLoad() ~~~ } ~~~ func A(){ myDelegate?.myTest() // ここの実行結果をViewControllerで受けたい } }

myDelegate.swift

import UIKit protocol myDelegate{ func myTest() }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/12/27 03:55

>←ここでビルドエラー【Value of type 'UIViewController' has no member 'newsDelegate’】 のnewsDelegateはどこから?違うところから引っ張ってきてないですか?
YS_

2019/12/27 06:20

myDelegateの誤記です。失礼しました、修正しました。
退会済みユーザー

退会済みユーザー

2019/12/27 06:32

いえいえ、単純なタイポで動かないのと関係ないならいいんです。
guest

回答3

0

ビルド通しただけだけど。

サンプル

swift

1import UIKit 2 3class ViewController: UIViewController, MyDelegate { 4 5 var viewdata = ViewData() 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additional setup after loading the view. 10 var controllers:[UIViewController] = [] 11 guard let topController = viewdata.getViewController("TEST") as? TestViewController else { return } 12 topController.myDelegate = self 13 controllers.append(topController) 14 15 } 16 17 func myTest() { 18 print("") 19 } 20 21} 22 23class TestViewController: UITableViewController{ 24 25 var myDelegate: MyDelegate? 26 27 override func viewDidLoad() { 28 super.viewDidLoad() 29 } 30 31 func doSomething() { 32 myDelegate?.myTest() 33 } 34} 35 36protocol MyDelegate { 37 38 func myTest() 39 40} 41 42class ViewData{ 43 44 func getViewController(_ text:String) -> UIViewController? { 45 switch text { 46 case "TEST" : 47 let storyboard:UIStoryboard = UIStoryboard(name:"Main",bundle:nil) 48 let TestView = storyboard.instantiateViewController(withIdentifier: "TEST") as! TestViewController 49 return TestView 50 51 default: fatalError("getViewController") 52 } 53 } 54 55} 56

投稿2019/12/29 04:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

getViewControllerの戻りの型をUIViewControllerとしているのがエラーの原因だと思います。

swift

1func getViewController(_ text:String) -> TestViewController {

に修正したらうまくいきそうに思います。

投稿2019/12/28 01:27

TakeOne

総合スコア6299

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

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

YS_

2019/12/28 23:29

ありがとうございます。TestViewControllerに変更したところ、topController.myDelegate = self は問題なく動作しました。しかし、getViewControllerのcase文でTestViewController以外の返り値を使えなくなるため、悩んでいます。TestViewController以外の型をcase文内で使い分けるのは難しいのでしょうか。
退会済みユーザー

退会済みユーザー

2019/12/29 01:45

でしたら、viewControllerを、戻り値にして、=selfの際にTestViewControllerにキャストしたらうまく行きますか?
YS_

2019/12/29 03:06

だめでした。。エラーになります。
guest

0

まず:

swift

1let TestView = storyboard.instantiateViewController(withIdentifier: "Test) as! TestViewController

swift

1let TestView = storyboard.instantiateViewController(withIdentifier: "Test") as! TestViewController

にしてください。

そして、

swift

1 override func viewDidLoad() { 2 super.viewDidLoad() 3 var controllers:[UIViewController]=[] 4 let topController = viewdata.getViewController("TEST") 5 topController.myDelegate = self // ←ここでビルドエラー【Value of type 'UIViewController' has no member 'newsDelegate’】 6 controllers.append(topController) 7 ~~~~~~ 8 }

ができません。
https://github.com/vanderlvoff/understandingDelegatesのレポを見て、ViewController.swift

swift

1 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 2 if let exe = segue.destination as? Test1{ 3 exe.delegate = self 4 } 5 }

を確認してください。

投稿2019/12/27 01:55

vanderlvov

総合スコア685

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

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

YS_

2019/12/27 02:24 編集

ご回答ありがとうございます。 "Test”は誤記です。 そして、override func prepare(for segue: UIStoryboardSegue, sender: Any?) {~~~ を試しましたところ、ビルドエラーは無くなりましたが デリゲートは実行されませんでした。。。。。
vanderlvov

2019/12/27 05:36

understandingDelegatesのプロジェクトをチェックアウトして、実行してみて、自分のプロジェクトと違うところを確定して、自分のコードを修正していただければいかがでしょうか。
YS_

2019/12/27 06:43

中間のファイル「VIewData.swift」を経由しないと行けませんので。そもそもの構成が違います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問