問題の概要
次のデータ構造に対し、TextFieldで編集を行う画面を実装しています。
・StaticなObservableObjectクラスStaticModel
にvalue変数を定義する
・ViewModelクラスViewModel
でStaticModel.value
をBindingする
・TextFieldでViewModel.value
をBindingする
アプリは次の動作となりました。
・TextFieldの入力は正しく完了し、StaticModel.value
の値が変化する
・TextFieldからフォーカスが移動すると、TextFieldの表示が戻る
→初期表示時「0」が表示されている場合、「50」を入力した後にフォーカスを外すと「0」表示に戻る
→「0」表示に戻った時点で、StaticModel.value
の値は「50」
・再度TextFieldにフォーカスを移したタイミングで表示が正しくなる
実現したいこと
上記のデータ構造でTextFieldからフォーカスを外した際に値が戻らないようにする方法をご教示いただけますと幸いです。
該当のソースコード
StaticModel
1class StaticModel: ObservableObject { 2 3 static let shared = StaticModel() 4 5 @Published var value = 0 { 6 didSet { 7 print("value = \(value)") 8 } 9 } 10}
ViewModel
1class ViewModel: ObservableObject { 2 3 @Binding var value: Int 4 5 init(value: Binding<Int>) { 6 _value = value 7 } 8}
ContentView
1struct ContentView: View { 2 3 @StateObject var viewModel: ViewModel 4 5 var body: some View { 6 Form { 7 Section { 8 HStack { 9 Text("数値") 10 TextField("数値を入力してください", value: $viewModel.value, formatter: NumberFormatter()) 11 .multilineTextAlignment(.trailing) 12 } 13 } 14 } 15 } 16}
App
1@main 2struct SampleApp: App { 3 4 @StateObject var staticModel = StaticModel.shared 5 6 var body: some Scene { 7 WindowGroup { 8 ContentView(viewModel: ViewModel(value: $staticModel.value)) 9 } 10 } 11}
試したこと
value
変数をViewModelに持たせる等単純な実装に変えた場合、TextFieldの動作は正しくなりました。
StaticModel
にvalue
変数を持たせる事が原因となっていると考えておりますが、解決策が見いだせていません。
補足情報(FW/ツールのバージョンなど)
Xcode Version 14.1 (14B47b)
そもそも static を使うのが間違いというか…。
https://fuuno.net/swift/static/static.html

回答1件
あなたの回答
tips
プレビュー