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

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

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

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

Q&A

解決済

1回答

1853閲覧

SwiftUIで設定画面の状態を別のクラスから参照する方法について知りたいです

sunmo

総合スコア10

Xcode

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

0グッド

0クリップ

投稿2021/01/05 14:13

前提・実現したいこと

SwiftUIで設定画面を作り、その設定内容を別の処理を行うクラスから直接参照したいのですが、
その方法がわかりません。

例えば、設定画面に色別のトグルを用意し、「実行」ボタンを押したときに、
その各トグルがONかOFFかどうか判断して処理を分たい場合です。

設定項目が1個とかであれば引数に設定するなどで対応できそうなのですが、
設定項目が複数ある場合も同様の方法になるのでしょうか?

設定画面を設けたアプリにおいて、その設定内容をどのように扱うのか
一般的なお作法をご教授いただきたいです。

SwiftUI

1import Foundation 2import SwiftUI 3 4public class SettingInfo : ObservableObject { 5 @Published var flagRed = true 6 @Published var flagBlue = true 7 @Published var flagGreen = true 8 @Published var flagYellow = true 9 @Published var flagPurple = true 10} 11

SwiftUI

1struct ColorSelectView: View { 2 @EnvironmentObject var setting : SettingInfo 3 4 var body: some View { 5 Section(header: Text("色を選択してください").foregroundColor(.black)){ 6 HStack 7 { 8 Toggle(isOn: $setting.flagRed) { 9 Text(setting.flagRed ? "赤ON" : "赤OFF") 10 .foregroundColor(.red) 11 } 12 .toggleStyle(SwitchToggleStyle(tint: Color.red)) 13 14 Toggle(isOn: $setting.flagBlue) { 15 Text(setting.flagBlue ? "青ON" : "青OFF") 16 .foregroundColor(.blue) 17 } 18 .toggleStyle(SwitchToggleStyle(tint: Color.blue)) 19 20 Toggle(isOn: $setting.flagGreen) { 21 Text(setting.flagGreen ? "緑ON" : "緑OFF") 22 .foregroundColor(.green) 23 } 24 .toggleStyle(SwitchToggleStyle(tint: Color.green)) 25 } 26 HStack 27 { 28 Toggle(isOn: $setting.flagYellow) { 29 Text(setting.flagYellow ? "黄ON" : "黄OFF") 30 .foregroundColor(.yellow) 31 } 32 .toggleStyle(SwitchToggleStyle(tint: Color.yellow)) 33 34 Toggle(isOn: $setting.flagPurple) { 35 Text(setting.flagPurple ? "紫ON" : "紫OFF") 36 .foregroundColor(.purple) 37 } 38 .toggleStyle(SwitchToggleStyle(tint: Color.purple)) 39 40 } 41 42 } 43 } 44} 45

試したこと

別のクラスから SettingInfo().flagRed と表現するとコンパイルは通るのですが、
正しい値を取れていません。

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

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

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

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

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

hoshi-takanori

2021/01/05 15:21

SettingInfo をシングルトンにするといいと思います。
sunmo

2021/01/06 08:30

ご指摘ありがとうございます!無事にやりたいことを実装することができました。 シングルトンというキーワードを初めて知りました。 勉強になります。ありがとうございました。
hoshi-takanori

2021/01/06 09:40

すばらしいです。 ついでに、UserDefaults というものを使うと、設定内容を簡単に保存・復元できますよ。
sunmo

2021/01/09 03:48

そうなのですね!ありがとうございます! ちょうど次はそこを試そうと思っていました。重ねてお礼申し上げます!
guest

回答1

0

自己解決

ご教授いただいたシングルトンを用いる方法で実現できました。

下記サイトを参考に実装いたしました。

シングルトンをSwift5で実装する

SwiftUI

1import Foundation 2import SwiftUI 3 4public class SettingInfo : ObservableObject { 5 static let shared = SettingInfo() //★追加 6 private init(){} //★追加 7 @Published var flagRed = true 8 @Published var flagBlue = true 9 @Published var flagGreen = true 10 @Published var flagYellow = true 11 @Published var flagPurple = true 12}

SwiftUI

1struct ColorSelectView: View { 2 //@EnvironmentObject var setting : SettingInfo //★削除 3 @ObservedObject var setting = SettingInfo.shared //★追加 4 5 var body: some View { 6 ~省略~ 7 } 8}

この変更により、SettingInfo.shared.flagRedとすると、画面から変更した内容を
参照することができました。

投稿2021/01/06 08:26

sunmo

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問