###前提
Swift初学者です。Swift、xcodeで時間割アプリを作成しています。
現在は全てのコマにおいて共通の変数で表示しているため、同じもの(講義名など)が表示されています。
###実現したいこと
TextFieldの@State変数の文字列(講義名など)をアプリ終了後も保持させたいです。
発生している問題・エラーメッセージ
エラーは発生しないが、TextFieldの@State変数をUserDefaults.standard.setで保持することができない。
シミュレーター上で変更、タスクキル後再びアプリを開くと最初に定義しているほげほげ学に戻ってしまっている。
該当のソースコード
import SwiftUI
import Foundation
struct ContentView: View {
@State var name: String = "ほげほげ学"
@State var room: String = "1-2-3"
var DotW = ["月","火","水","木","金"] var i = 0 var body: some View { NavigationView { VStack{ Text("時間割") HStack{ VStack{ Text("") ForEach(1..<6) { Text("($0)") Spacer() } } ForEach(DotW, id: .self) { choice in VStack { Text(choice) ForEach(/*@START_MENU_TOKEN@*/0 ..< 5/*@END_MENU_TOKEN@*/) { item in HogeView(name: self.$name,room: self.$room) Spacer() } } .onAppear { guard let userdefaultText = UserDefaults.standard.value(forKey: "name") as? String else { return } self.name = userdefaultText } } } } } }
}
struct HogeView: View {
@Binding var name: String
@Binding var room: String
var body: some View {
NavigationLink(destination: HogeSecondView(name: self.$name,room: self.$room)) {
VStack{
Text("(name)")
// Spacer()
Text("(room)")
// Spacer()
}
}
}
}
struct HogeSecondView: View {
@Binding var name: String
@Binding var room: String
var body: some View {
VStack{
HStack{
Text("講義名")
TextField("",text: $name, onCommit: {
UserDefaults.standard.set(self.name, forKey: "name")
})
}
HStack{
Text("講義室")
TextField("",text: $room)
}
}
}
}
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
ContentView()
}
}
試したこと
.onAppearの場所の変更
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。