前提
カレンダーで選択した日付をday(Date型)として読み取り、その日付と今日の日付との差を自動的に計算し表示するシステムを作っております。
そして現在選択した日付selectedDateを@AppStorageで保存するコードを書いています。
実現したいこと
- 一度アプリをシャットダウンしても選択した日付、dayが保存されているようにしたい
発生している問題
選択した日付、selectedDateを保存したいのですが、すでに
@Binding var selectedDate: Date
と定義しているため、@AppStorageを追加する訳にもいかず、困っているという状況です。
初歩的な質問だと思うのですが、お分かりになる方、回答よろしくお願いします。
該当のソースコード
CalendarView.swift
1import SwiftUI 2import FSCalendar 3import UIKit 4 5struct CalendarTestView: UIViewRepresentable { 6 @Binding var selectedDate: Date 7 func makeUIView(context: Context) -> UIView { 8 9 typealias UIViewType = FSCalendar 10 11 let fsCalendar = FSCalendar() 12 13 fsCalendar.delegate = context.coordinator 14 fsCalendar.dataSource = context.coordinator 15 16 return fsCalendar 17 } 18 19 func updateUIView(_ uiView: UIView, context: Context) { 20 } 21 22 func makeCoordinator() -> Coordinator{ 23 return Coordinator(self) 24 } 25 26 class Coordinator: NSObject, FSCalendarDelegate, FSCalendarDataSource { 27 var parent:CalendarTestView 28 29 init(_ parent:CalendarTestView){ 30 self.parent = parent 31 } 32 33 func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) { 34 // ***** 選択した日付をバインディングのselectedDateへ設定します 35 parent.selectedDate = date 36 } 37 38 } 39} 40 41struct CalendarApealView: View{ 42 @State private var date: Date = Date() 43 @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode> 44 @Binding var day: String 45 46 @State var onSwitch = false 47 @State var text = "hello" 48 var differString: String { 49 50 let calendar = Calendar.current 51 //today1は今日の日付 52 let today1 = Date() 53 let today2 = calendar.dateComponents([.year, .month, .day], from: today1) 54 let today3 = calendar.date(from: DateComponents(year: today2.year, month: today2.month, day: today2.day))! 55 let date2 = calendar.dateComponents([.year, .month, .day], from: date) 56 let date3 = calendar.date(from: DateComponents(year: date2.year, month: date2.month, day: date2.day))! 57 let result = calendar.dateComponents([.day], from: date3, to: today3) 58 return "\(result.day!)" 59 } 60 func set(_: Any?, forKey:String){ 61 62 } 63 var body: some View { 64 HStack{ 65 VStack{ 66 Text("When did you start this food style?") 67 .font(.title2) 68 CalendarTestView(selectedDate: $date) 69 .frame(height: 400) 70 HStack(){ 71 Text(differString) 72 .font(.title) 73 .padding() 74 .foregroundColor(Color(red: 0.324, green: 0.758, blue: 0.49)) 75 Text("Days") 76 .font(.title2) 77 } 78 79 Button(action: { 80 //ここでdayに値代入! 81 day = differString 82 UserDefaults.standard.set(self.differString, forKey: "String") 83 func StringToDate(dateValue: String, format: String) -> Date { 84 let dateFormatter = DateFormatter() 85 dateFormatter.calendar = Calendar(identifier: .gregorian) 86 dateFormatter.dateFormat = format 87 return dateFormatter.date(from: dateValue) ?? Date() 88 } 89 date = StringToDate(dateValue: differString, format: "yyyy/MM/dd") 90 self.onSwitch.toggle() 91 self.presentationMode.wrappedValue.dismiss() 92 }) { 93 Text("confirm") 94 .font(.title2) 95 .padding(16) 96 .background(Color(red: 0.324, green: 0.758, blue: 0.49)) 97 .foregroundColor(Color.white) 98 .cornerRadius(10) 99 } 100 } 101 }.navigationTitle("Day Setting") 102 } 103} 104 105struct CalendarTestView_Previews: PreviewProvider { 106 static var previews: some View { 107 CalendarApealView(day: .constant("12")) 108 } 109}
補足情報(FW/ツールのバージョンなど)
macOS バージョン12.3.1
2.6 GHz 6コアIntel Core i7
Xcodeバージョン13.3.1

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/06 07:10 編集