###やりたいこと
TabViewの中にtest1,test2のViewがあります。
test1にはボタンが一つ用意されています。test2には「false」の文字があります。
test1のボタンを押すとtest2で画面更新が行われ文字が「true」に変わる。
###問題点
test1のボタンを押しても、test2での画面更新が行われず、ずっと「false」のままになってしまっています。
プレビューの停止ボタンを押して、再び再生ボタンを押すとtest2の文字は「true」になるため、変数内での値はちゃんと変わっています。
そのため、test1で値が変わった時にtest2の画面の更新がされていないため、それを行うための方法をご教授いただければと思います。
###ContentView
swiftUI
1import SwiftUI 2 3struct ContentView: View { 4 @ObservedObject var user = UserProfile() 5 var body: some View { 6 TabView{ 7 test1View() 8 .tabItem { 9 Image(systemName: "1.circle") 10 } 11 test2View() 12 .tabItem { 13 Image(systemName: "2.circle") 14 } 15 } 16 } 17}
###test1View
SwiftUI
1struct test1View: View { 2 @ObservedObject var user = UserProfile() 3 4 var body: some View { 5 VStack{ 6 Button(action: { 7 user.Toggle() 8 }) { 9 Text("Button1") 10 .font(.title2) 11 .fontWeight(.black) 12 .foregroundColor(Color.white) 13 .padding(.all) 14 .background(user.flag ? Color.gray.opacity(0.2) : Color.gray.opacity(0.7)) 15 } 16 } 17 } 18}
###test2View
SwiftUI
1struct test2View: View { 2 @ObservedObject var user = UserProfile() 3 var body: some View { 4 VStack{ 5 if user.flag { 6 Text("true") 7 } 8 else{ 9 Text("false") 10 } 11 } 12 } 13}
###Store
flagは保存しておきたいのでUserDefaultsを使いました。
Swift
1import Foundation 2 3class UserProfile: ObservableObject { 4 @Published var flag : Bool 5 6 func Toggle(){ 7 flag.toggle() 8 UserDefaults.standard.set(flag, forKey: "flag") 9 } 10 11 init() { 12 flag = UserDefaults.standard.bool(forKey: "flag") 13 } 14}
SwiftUIを最近学習し始めた者のためとても初歩的な質問をしてしまっていると思いますが、どうかよろしくお願いいたいします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/21 11:17
2021/06/22 00:35
2021/06/22 06:57