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

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

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

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

Q&A

2回答

558閲覧

SwiftUIとSwiftを使いObservableObjectのtoggleの状態を他のclassから参照し表示したい

X001017

総合スコア6

Swift

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

0グッド

0クリップ

投稿2022/12/21 00:46

編集2022/12/21 01:17

前提

SwiftUIとSwiftを使いObservableObjectのtoggleの状態を他のclassから参照し表示したいと考えています。
インスタンスにおいての問題等がよくわかっておらず非常に悩んでおります。

実現したいこと

上記の通りとなります。

  • [ ]ClassModel: ObservableObjectの@Published var flagの状態を他のclass(ClassModelTwo: NSObject)から参照しprint文で表示したい

該当のソースコード

SwiftUI

1struct ContentView: View { 2 @StateObject var classModel = ClassModel() 3 var body: some View { 4 VStack { 5 Toggle("", isOn: $classModel.flag) 6 .labelsHidden() 7 .onChange(of: classModel.flag) { newValue in 8 classModel.testFlag() 9 } 10 Text("Hello, world!") 11 } 12 .padding() 13 .environmentObject(classModel) 14 } 15} 16 17class ClassModel: ObservableObject { 18 19 @Published var flag = true 20 func testFlag() { 21 // ClassModelTwoのtestFlagを実行したい 22 .testFlag() 23 } 24 25} 26 27class ClassModelTwo: NSObject { 28 29 func testFlag() { 30 print(// ClassModelの@Published var flag = true/falseの値を表示したい) 31 } 32}

試したこと

インスタンスの生成などの仕方や問題であるとは思うのですが、よくわかっておらず非常に悩んでおります。

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

Xcode 14.1 (14B47b)

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

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

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

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

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

guest

回答2

0

うまくグローバル変数に宣言することが出来たため
追加で回答します。

この方法ならばどこからでも変数を使用できるハズです。

SwiftUI

1import SwiftUI 2 3var classModelOne = ClassModelOne() 4var classModelTwo = ClassModelTwo() 5 6struct ContentView: View { 7 @StateObject var model: ClassModelOne = classModelOne 8 9 var body: some View { 10 VStack { 11 Toggle("", isOn: $model.flag) 12 .labelsHidden() 13 .onChange(of: model.flag) { newValue in 14 model.testFlag() 15 } 16 Text("Hello, world!") 17 } 18 .padding() 19 .environmentObject(model) 20 } 21} 22 23class ClassModelOne: ObservableObject { 24 @Published var flag = true 25 func testFlag() { 26 classModelTwo.testFlag() 27 } 28} 29 30class ClassModelTwo: NSObject { 31 func testFlag() { 32 print(classModelOne.flag) 33 } 34}

投稿2022/12/22 01:06

uni2

総合スコア256

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

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

0

ClassModelOne でメソッドを作る時に
ClassModelTwo を使用するならば
ClassModelTwo を引数に持つのは如何でしょうか?

記述量が増えてしまいますが
@StateObject が曲者で
グローバル変数に持たせたりすることが出来ないため
ショートカットは無さそうに見えます。

SwiftUI

1import SwiftUI 2 3struct ContentView: View { 4 @StateObject var classModelOne = ClassModelOne() 5 var classModelTwo = ClassModelTwo() 6 7 var body: some View { 8 VStack { 9 Toggle("", isOn: $classModelOne.flag) 10 .labelsHidden() 11 .onChange(of: classModelOne.flag) { newValue in 12 classModelOne.testFlag(classModelTwo: classModelTwo) 13 } 14 Text("Hello, world!") 15 } 16 .padding() 17 .environmentObject(classModelOne) 18 } 19} 20 21class ClassModelOne: ObservableObject { 22 @Published var flag = true 23 func testFlag(classModelTwo: ClassModelTwo) { 24 // ClassModelTwoのtestFlagを実行したい 25 classModelTwo.testFlag(classModelOne: self) 26 } 27} 28 29class ClassModelTwo: NSObject { 30 func testFlag(classModelOne: ClassModelOne) { 31 print(classModelOne.flag) 32 } 33}

classModelTwo は @StateObject がついていないため
グローバル変数にすることでショートカットすることが出来ます。

SwiftUI

1import SwiftUI 2 3var classModelTwo = ClassModelTwo() 4 5struct ContentView: View { 6 @StateObject var classModelOne = ClassModelOne() 7 8 var body: some View { 9 VStack { 10 Toggle("", isOn: $classModelOne.flag) 11 .labelsHidden() 12 .onChange(of: classModelOne.flag) { newValue in 13 classModelOne.testFlag() 14 } 15 Text("Hello, world!") 16 } 17 .padding() 18 .environmentObject(classModelOne) 19 } 20} 21 22class ClassModelOne: ObservableObject { 23 @Published var flag = true 24 func testFlag() { 25 // ClassModelTwoのtestFlagを実行したい 26 classModelTwo.testFlag(classModelOne: self) 27 } 28 29} 30 31class ClassModelTwo: NSObject { 32 func testFlag(classModelOne: ClassModelOne) { 33 print(classModelOne.flag) 34 } 35}

投稿2022/12/21 05:36

編集2022/12/21 05:42
uni2

総合スコア256

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

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

X001017

2022/12/21 07:34

ありがとうございます。やはり引数で渡すくらいしかないですかね、、。 初め以下のようにすればとも思ったところ、nilにしかならず何かしら良い方法がといろいろ試したのですがどうしても上手く動作させることができずでした。 class ClassModel: ObservableObject { var classModelTwo = ClassModelTwo() @Published var flag = true func testFlag() { // ClassModelTwoのtestFlagを実行したい classModelTwo.testFlag() } } class ClassModelTwo: NSObject { weak var classModel: ClassModel? func testFlag() { print(classModel?.flag) } }
uni2

2022/12/22 01:07

うまくグローバル変数に宣言する方法が見つかったため 別回答で回答しておきます。 グローバル変数に宣言する方法は無いように見えたのですが 何故かうまく宣言できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問