NotificationsView.swift
構造体にCondableとIdentifiableを追加。項目にidを追加。 fruitsを定義する際に空初期値をセット。
NavigationViewを追加。onAppear時にloadUd関数を呼出。
VStackにタイトル追加。
ForEachの書き方をindexを使わない方法に変更。
行タップ時にFruitを再作成し、saveUd関数を呼出。
loadUd関数で、UserDefaultsからtabapp_valueをキーにしてデータ取得。
データがない場合は構造体配列に初期値をセット。
データがある場合はPropertyListDecoderでdecodeして構造体配列にセット。
saveUd関数で、構造体配列をPropertyListEncoderでencodeして、tabapp_valueをキーにしてUserDefaultsに保存。
Codableは構造体をシリアルにして、UserDefaultsに保存するため、
Identifiableはループするため。
[Product]-[Run]実行
左上のTabApplicationで戻って、Notificationsを選択。
通知設定状況を変化させる。
Home選択でWebを表示。アプリを終了
アプリを起動してWebを表示。
左上のTabApplicationで戻って、Notificationsを選択。
変化させた通知設定状況が表示される。
構造体にCondableとIdentifiableを追加。項目にidを追加。 fruitsを定義する際に空初期値をセット。
NavigationViewを追加。onAppear時にloadUd関数を呼出。
VStackにタイトル追加。
ForEachの書き方をindexを使わない方法に変更。
行タップ時にFruitを再作成し、saveUd関数を呼出。
loadUd関数で、UserDefaultsからtabapp_valueをキーにしてデータ取得。
データがない場合は構造体配列に初期値をセット。
データがある場合はPropertyListDecoderでdecodeして構造体配列にセット。
saveUd関数で、構造体配列をPropertyListEncoderでencodeして、tabapp_valueをキーにしてUserDefaultsに保存。
struct Fruit { var kind: String var checked: Bool init(_ kind: String, checked: Bool) { self.kind = kind self.checked = checked } } struct NotificationsView: View { @State var fruits:[Fruit] = [ Fruit("やまぶどう", checked: true), Fruit("からすうり", checked: true), Fruit("へびいちご", checked: true), Fruit("じゅずだま", checked: true) ] var body: some View { VStack{ List { ForEach(0 ..< fruits.count) { index in HStack { Text(self.fruits[index].kind) Spacer() Text(self.fruits[index].checked ? "通知あり" : "通知なし") Image(self.fruits[index].checked ? "toggleon" : "toggleoff") } .contentShape(Rectangle()) .onTapGesture { self.fruits[index].checked.toggle() } } } } } }
→
struct Fruit: Codable,Identifiable { let id: Int var kind: String var checked: Bool init(_ id: Int, kind: String, checked: Bool) { self.id = id self.kind = kind self.checked = checked } } struct NotificationsView: View { @State private var fruits:[Fruit] = [] @State private var chk:Bool = false var body: some View { NavigationView { VStack{ List { ForEach(self.fruits) { fruit in HStack{ Text(fruit.kind) Spacer() Text(fruit.checked ? "通知あり" : "通知なし") Image(fruit.checked ? "toggleon" : "toggleoff") } .contentShape(Rectangle()) .onTapGesture { self.chk = fruit.checked self.chk.toggle() self.fruits[fruit.id] = Fruit(fruit.id,kind:fruit.kind,checked:self.chk) self.saveUd() } } } } .navigationBarTitle("設定") } .onAppear (perform: loadUd) } private func loadUd() { if let ud = UserDefaults.standard.value(forKey: "tabapp_value") as? Data { if let fruitsList = try? PropertyListDecoder().decode(Array<Fruit>.self, from: ud) { self.fruits = fruitsList } }else { self.fruits = [Fruit(0,kind:"やまぶどう",checked:true), Fruit(1,kind:"からすうり",checked:true), Fruit(2,kind:"へびいちご",checked:true), Fruit(3,kind:"じゅずだま",checked:true)] } } private func saveUd() { UserDefaults.standard.set(try? PropertyListEncoder().encode(self.fruits), forKey: "tabapp_value") } }
Identifiableはループするため。
[Product]-[Run]実行
左上のTabApplicationで戻って、Notificationsを選択。
通知設定状況を変化させる。
Home選択でWebを表示。アプリを終了
アプリを起動してWebを表示。
左上のTabApplicationで戻って、Notificationsを選択。
変化させた通知設定状況が表示される。