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

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

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

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

4回答

1684閲覧

遷移などの関係にないViewController間でのdelegateの方法(アプリでの設定画面の実装方法)

pascal1623

総合スコア18

Delegates

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2019/07/01 13:22

前提・実現したいこと

SwiftでiOSのツール的なアプリを作っています。
以前にも質問したのですが、delegateを用いたアプリの設計がわからず、またつまずいています。

現在の作成しているアプリは、上半分に表示画面、下半分に設定画面があります。
表示画面はいくつか入れ替えて表示したいためcontainerViewになって、それぞれにViewController(displayViewController)を設定しています。
下半分も今後の拡張のためにここだけでViewController(settingViewController)を設定しました。

設定画面で設定を変更した時に、表示画面内の表示を変更するために、
settingViewControllerからdelegateでdisplayViewControllerの変数を変更したり関数を実行すればいいと考えてアプリを作り始めたのですがうまく行きません。

以前に質問した時は、tabBarで切り替えているViewControllerどうしでdelegateをしようとしたので、
tabBar経由でViewControllerのインスタンスを取得することでdelegateを設定できるように教えていただきました。

今回のアプリでは、そういった繋がりがないViewController間でのdelegateになり、どのようにプログラムを書いていいのかわかりません。

また、そもそもの話として、以前の質問もそうだったのですが、設定の画面をいじった時に、表示の画面を変更するというのはこういったViewController間のdelegateでやるようなことではなくて、もっと一般的な別の方法があるのでしょうか。
(アプリの設定部分というのは一般的にどのように実装されているのでしょうか?)

もともと全く違った分野の人間で周囲に全く聞くことができる人がいなくて、的外れなことも多々あると思いますが、ご教示頂けますと幸いです。

該当のソースコード(DiaplayViewController)

Swift

1 2//DisplayViewController 3import UIKit 4 5class DisplayViewController: UIViewController, DisplayDelegate { 6 7 8  @IBOutlet weak var settingViewController:SettingViewController! 9 //こう書いてみてもどのように接続すればいいかわかりませんでした。 10 11 func test() { 12 print("called delegate") 13 } 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 } 18} 19 20 21override func viewWillAppear(_ animated: Bool) { 22 let storyboard = UIStoryboard(name: "Main", bundle: nil) 23 settingViewController = (storyboard.instantiateViewController(withIdentifier: "SettingViewController") as! SettingViewController) 24 settingViewController.delegate = self 25//こう書いてもうまくインスタンスを取得できないことを以前教えてもらいました。 26 } 27}

該当のソースコード(SettingViewController)

Swift

1import UIKit 2 3class SettingViewController: UIViewController { 4 5 var delegate: DisplayDelegate? 6 7 func callTest() { 8 self.delegate?.test() 9 } 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 } 14} 15

該当のソースコード(SettingViewController)

Swift

1import UIKit 2 3class SettingViewController: UIViewController { 4 5 var delegate: DisplayDelegate? 6 7 func callTest() { 8 self.delegate?.test() 9 } 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 } 14 15 override func viewWillAppear(_ animated: Bool) { 16 let storyboard = UIStoryboard(name: "Main", bundle: nil) 17 let settingViewController = (storyboard.instantiateViewController(withIdentifier: "SettingViewController") as! SettingViewController) 18 // こちらもダメのようです。またどのようにdelegateを設定すればいいのかわかりませんでした。 19     // delegate = settingViewController.viewControllers? as? DisplayDelegate 20 // ↑これでは設定できなかったです。 21 } 22} 23

試したこと

上記ソースコードのような方法でViewControllerのインスタンスを取得することができないことを以前に教えていただいています。

@IBOutlet weak var settingViewController:SettingViewController!
と書いてもstoryBoard内のsettingViewControllerと接続することができませんでした。

補足情報(FW/ツールのバージョンなど)

XCodeのバージョンは10で最新の環境となっていると思います。

ここにより詳細な情報を記載してください。

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

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

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

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

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

fuzzball

2019/07/02 00:33

>>上半分に表示画面、下半分に設定画面があります これはどういう実装になっていますか?
pascal1623

2019/07/02 12:04

お返事が遅くなりまして申し訳ありません。 iPhoneの画面の中を上下に表示部分と設定部分をviewとして配置しています。 (正確は他にラベルやtabBarなどの部品はありますがメインは二つのviewです) 表示画面はcontainerViewになっていて、アプリの状態で表示を切り替えられるようになっていて、それぞれにviewControllerを設定をしています。 設定画面はボタンなどが配置されているviewになっていて、こちらもviewControllerがあり、その中のボタンを押すと現在選択されている表示画面のcontainerView内のアクションさせるつもりでした。 (最初は同じviewの中にボタンも表示もあったので一つのviewControllerの中でボタンをタップすると表示が変わるようにコードを書けば済んでいました) このように互いには独立したview同士なのですが、処理を設定view→表示viewと伝播させるためには、他のインスタンスに処理を任せるdelegateを使ったらいいかと思った次第です。 どのようなことであっても教えていただけますと幸いです。 よろしくお願いいたします。
fuzzball

2019/07/02 12:12

ContainerViewを使っているなら、ContainerViewが載っているViewControllerを仲介してやり取り出来ないですか?
pascal1623

2019/07/02 12:20

表示view:複数のcontainerViewで構成されています。iPhoneの画面の上側に配置しています。 設定view:それとは違ったviewでiPhoneの画面の下側に配置してあります。 とそれぞれは別のviewになっていますが、載っているviewを介してインスタンスを取得することができるのでしょうか。 それぞれが載っているのはFirstViewControllerということになりますが、どのように記載したら良いのでしょうか。 お手数をおかけしますが、ご教示頂けますと幸いです。
fuzzball

2019/07/03 02:23

表示画面と設定画面の両方のインスタンスを把握している「親」がいるはずなので、そこで仲介して下さい。(FirstViewControllerが親でしょうか?)
pascal1623

2019/07/03 08:06

let firstViewController = self.parent as! FirstViewController let displayViewController = firstViewController.children[n] as! DisplayViewController // nは取得したindexの数値 教えていただいたことと、ネットの情報を参考にsettingViewControllerに上記コードを記載(nは取得したindexの数値)することで、無事にdisplayViewControllerのインスタンスを取得して、その中の関数を実行することができました。 教えていただいて大変ありがとうございました。 また精進して参ります。
guest

回答4

0

ベストアンサー

こんな方法はどうでしょうか。
[Swift3.1] NotificationCenterを使ってViewController間でイベント通知を送る
あとはイベントを受け取ったときに保存されている設定情報を参照して、画面表示を変更する。とか。

投稿2019/07/02 02:13

dsuzuki

総合スコア1682

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

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

pascal1623

2019/07/02 12:06

delegateを使ってやることに固執していて、他の方法が思い浮かんでいませんでした。 NotificationCenterを使ってコードを書いて、また結果をご報告させていただきます。
pascal1623

2019/07/03 08:11

こちらの方法もやらせていただきました。 NotificationCenterを使用することで、こちらも大変すっきりと他のViewControllerのメソッドを実行するkとができました。 一人で唸っていても解決できなかったことを教えていただいて大変ありがとうございました。 これからも精進させていただきます。
guest

0

//displayViewに加筆

extension Notification.Name {
static let myNotificationName = Notification.Name("myNotificationName")
}

let notificationCenter = NotificationCenter.default

@objc func catchNotification(notification: Notification) -> Void {
print("Catch notification")
}

override func viewWillAppear(_ animated: Bool) {
notificationCenter.addObserver(self, selector: #selector(catchNotification(notification:)), name: .myNotificationName, object: nil)
}

//settingViewControllerに加筆

let notificationCenter = NotificationCenter.default

func callNotification() {
notificationCenter.post(name: .myNotificationName, object: nil)
}

投稿2019/07/03 09:05

pascal1623

総合スコア18

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

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

0

let firstViewController = self.parent as! FirstViewController
let displayViewController = firstViewController.children[n] as! DisplayViewController
// nは取得したindexの数値

投稿2019/07/03 08:44

pascal1623

総合スコア18

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

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

0

let firstViewController = self.parent as! FirstViewController
let displayViewController = firstViewController.children[n] as! DisplayViewController
// nは取得したindexの数値

投稿2019/07/03 08:13

pascal1623

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問