前提・実現したいこと
SwuftUIを利用して、アプリを開発しています。
以下の条件で、以下の動作をしたいのですが、適切なコードの書き方がわかりません。
・条件
- ①ContentView
- ②FirstView
- ③SecondView
の3つのstructがあり、①ContentView内のTabViewで②、③のview間を遷移する
・希望の動作
②と③のView間で共通の変数を(Bool型)を利用し、それぞれのViewで表示を変える
(変数がtrueであればTextが表示される)
発生している問題
こちらのサイトを参考にし、コードを作成していますが、うまく応用できません。
うまくいかない動作の事例
①:ViewModelで定義した共通の変数を、SecondViewで宣言、初期化し、BindingしてToggleメソッドに利用でき、SecondView内のみであれば希望どおりに動作するが、FirstViewに遷移するとSecondViewで設定した変数が引き継げない
②:参考にしているサイトの解説をみると、遷移先のFirstViewで共通の変数を初期化すると、値を引き継いで利用できないとあるため、宣言のみとすると、previewする時にエラーとなる。
このような状況なのですが、解決の方法についてご存知の方おりましたら、ご教授いただけないでしょうか?
該当のソースコード
ContentView
SwiftUI
1import SwiftUI 2 3struct ContentView: View { 4 var body: some View { 5 TabView { 6 FirstView() 7 .tabItem { 8 Text("First") 9 }.tag(1) 10 11 SecondView() 12 .tabItem { 13 Text("Second") 14 }.tag(3) 15 } 16 } 17} 18 19struct ContentView_Previews: PreviewProvider { 20 static var previews: some View { 21 ContentView() 22 } 23} 24
FirstView
SwiftUI
1import SwiftUI 2 3struct FirstView: View { 4 5 @ObservedObject var firstCheck: ViewModel = ViewModel() //エラーがでないように初期化しています 6 7 var body: some View { 8 VStack{ 9 if firstCheck.check == true{ 10 Text("checked") 11 } 12 } 13 } 14} 15 16struct FirstView_Previews: PreviewProvider { 17 static var previews: some View { 18 FirstView() 19 } 20}
SecondView
SwiftUI
1import SwiftUI 2 3struct SecondView: View { 4 5 @ObservedObject var secondCheck = ViewModel() 6 7 8 var body: some View { 9 VStack{ 10 Toggle( 11 isOn: $secondCheck.check 12 ){ 13 Text("change") 14 } 15 if self.secondCheck.check == true{ 16 Text("checked") 17 } 18 } 19 } 20} 21 22struct SecondView_Previews: PreviewProvider { 23 static var previews: some View { 24 SecondView() 25 } 26}
ViewModel
swift
1import Foundation 2 3final class ViewModel: ObservableObject { 4 @Published var check: Bool = false 5}
補足情報(FW/ツールのバージョンなど)
Xcode: Version 11.7
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。