前提
カレンダーで選択した日付をday(Date型)として読み取り、その日付と今日の日付との差を自動的に計算し表示するシステムを作っております。
表示することはできたのですが、その情報を保存する機能の実装中にエラーが発生してしまいました。
保存可能にする機能は、この教材をもとに進めています。
https://developer.apple.com/tutorials/app-dev-training/persisting-data
カレンダーにはFSCalendarというライブラリを用いています。
実現したいこと
一度アプリをシャットダウンしても選択した日付、dayが保存されているようにしたい
発生している問題・エラーメッセージ
App.swift
にこのようなエラーメッセージが発生しました。
Incorrect argument label in call (have 'day:_:', expected 'saveAction:day:')
これを解決しようとしていたのですが、
App.swift
でCalendarApealView()を呼び出す時、
dayについてCalendarApealView(day: $store.scrums)
としたように、
同様にsaveActionを呼び出す処理の記載はどのようにしたら良いか?
が分からず頓挫してしまいました。
お分かりの方ご回答お願いいたします!
該当のソースコード
CalendarViewController.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 17 18 return fsCalendar 19 } 20 21 func updateUIView(_ uiView: UIView, context: Context) { 22 } 23 24 func makeCoordinator() -> Coordinator{ 25 return Coordinator(self) 26 } 27 28 class Coordinator: NSObject, FSCalendarDelegate, FSCalendarDataSource { 29 var parent:CalendarTestView 30 31 init(_ parent:CalendarTestView){ 32 self.parent = parent 33 } 34 35 func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) { 36 // ***** 選択した日付をバインディングのselectedDateへ設定します 37 parent.selectedDate = date 38 } 39 40 } 41} 42 43struct CalendarApealView: View{ 44 @Environment(\.scenePhase) private var scenePhase 45 let saveAction: ()->Void 46// @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode> 47 @State private var date: Date = Date() 48 @Binding var day: Date 49 var differString: String { 50 let value = UserDefaults.standard.string(forKey: "String") 51 print(value!) 52 let calendar = Calendar.current 53 //today1は今日の日付 54 let today1 = Date() 55 let today2 = calendar.dateComponents([.year, .month, .day], from: today1) 56 let today3 = calendar.date(from: DateComponents(year: today2.year, month: today2.month, day: today2.day))! 57 let date2 = calendar.dateComponents([.year, .month, .day], from: date) 58 let date3 = calendar.date(from: DateComponents(year: date2.year, month: date2.month, day: date2.day))! 59 let result = calendar.dateComponents([.day], from: date3, to: today3) 60 return "\(result.day!)" 61 } 62 func set(_: Any?, forKey:String){ 63 64 } 65 var body: some View { 66 HStack{ 67 VStack{ 68 Text("When did you start this food style?") 69 .font(.title2) 70 CalendarTestView(selectedDate: $date) 71 .frame(height: 400) 72 HStack(){ 73 Text(differString) 74 .font(.title) 75 .padding() 76 .foregroundColor(Color(red: 0.324, green: 0.758, blue: 0.49)) 77 Text("Days") 78 .font(.title2) 79 } 80 Button(action: { 81 UserDefaults.standard.set(self.differString, forKey: "String") 82 func StringToDate(dateValue: String, format: String) -> Date { 83 let dateFormatter = DateFormatter() 84 dateFormatter.calendar = Calendar(identifier: .gregorian) 85 dateFormatter.dateFormat = format 86 return dateFormatter.date(from: dateValue) ?? Date() 87 } 88 date = StringToDate(dateValue: differString, format: "yyyy/MM/dd") 89// self.presentationMode.wrappedValue.dismiss() 90 }) { 91 Text("confirm") 92 .font(.title2) 93 .padding(16) 94 .background(Color(red: 0.324, green: 0.758, blue: 0.49)) 95 .foregroundColor(Color.white) 96 .cornerRadius(10) 97 } 98 } 99 }.navigationTitle("Day Setting") 100 .onChange(of: scenePhase) { phase in 101 if phase == .inactive { } 102 //{saveAction()} 103 } 104 } 105 106}
App.swift
1@main 2struct App: App { 3 @StateObject private var store = ScrumStore() 4 var body: some Scene { 5 WindowGroup { 6 ContentView() 7 NavigationView { 8 CalendarApealView(day: $store.scrums) { //ここにエラー 9 ScrumStore.save(dates: store.scrums) { result in 10 if case .failure(let error) = result { 11 fatalError(error.localizedDescription) 12 } 13 } 14 } 15 } 16 .onAppear { 17 ScrumStore.load { result in 18 switch result { 19 case .failure(let error): 20 fatalError(error.localizedDescription) 21 case .success(let dates): 22 store.scrums = scrums 23 } 24 } 25 } 26 } 27 } 28} 29
ScrumStore.swift
1import Foundation 2import SwiftUI 3 4class ScrumStore: ObservableObject { 5 @Published var scrums: Date = Date() 6 7 private static func fileURL() throws -> URL { 8 try FileManager.default.url(for: .documentDirectory, 9 in: .userDomainMask, 10 appropriateFor: nil, 11 create: false) 12 .appendingPathComponent("dates.data") 13 } 14 15 static func load(completion: @escaping (Result<Date, Error>)->Void) { 16 DispatchQueue.global(qos: .background).async { 17 do { 18 let fileURL = try fileURL() 19 guard let file = try? FileHandle(forReadingFrom: fileURL) else { 20 DispatchQueue.main.async { 21 completion(.success(Date())) 22 } 23 return 24 } 25 let dailyScrums = try JSONDecoder().decode(Date.self, from: file.availableData) 26 DispatchQueue.main.async { 27 completion(.success(dailyScrums)) 28 } 29 } catch { 30 DispatchQueue.main.async { 31 completion(.failure(error)) 32 } 33 } 34 } 35 } 36 static func save(dates: Date, completion: @escaping (Result<Date, Error>)->Void) { 37 DispatchQueue.global(qos: .background).async { 38 do { 39 let data = try JSONEncoder().encode(dates) 40 let outfile = try fileURL() 41 try data.write(to: outfile) 42 DispatchQueue.main.async { 43 completion(.success(dates)) 44 } 45 } catch { 46 DispatchQueue.main.async { 47 completion(.failure(error)) 48 } 49 } 50 } 51 } 52 53} 54
補足情報(FW/ツールのバージョンなど)
macOS バージョン12.3.1
2.6 GHz 6コアIntel Core i7
Xcodeバージョン13.3.1

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/07/27 08:33