前提・実現したいこと
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で最新の環境となっていると思います。
ここにより詳細な情報を記載してください。
回答4件
あなたの回答
tips
プレビュー