質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

解決済

【SwiftUI】@AppStorageと@Bindingを同時に使いたい

KaoruYoshida
runrun

総合スコア30

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

2回答

0リアクション

0クリップ

246閲覧

投稿2022/08/06 03:31

前提

カレンダーで選択した日付をday(Date型)として読み取り、その日付と今日の日付との差を自動的に計算し表示するシステムを作っております。
そして現在選択した日付selectedDateを@AppStorageで保存するコードを書いています。

実現したいこと

  • 一度アプリをシャットダウンしても選択した日付、dayが保存されているようにしたい

発生している問題

選択した日付、selectedDateを保存したいのですが、すでに
@Binding var selectedDate: Date
と定義しているため、@AppStorageを追加する訳にもいかず、困っているという状況です。

初歩的な質問だと思うのですが、お分かりになる方、回答よろしくお願いします。

該当のソースコード

CalendarView.swift

import SwiftUI import FSCalendar import UIKit struct CalendarTestView: UIViewRepresentable { @Binding var selectedDate: Date func makeUIView(context: Context) -> UIView { typealias UIViewType = FSCalendar let fsCalendar = FSCalendar() fsCalendar.delegate = context.coordinator fsCalendar.dataSource = context.coordinator return fsCalendar } func updateUIView(_ uiView: UIView, context: Context) { } func makeCoordinator() -> Coordinator{ return Coordinator(self) } class Coordinator: NSObject, FSCalendarDelegate, FSCalendarDataSource { var parent:CalendarTestView init(_ parent:CalendarTestView){ self.parent = parent } func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) { // ***** 選択した日付をバインディングのselectedDateへ設定します parent.selectedDate = date } } } struct CalendarApealView: View{ @State private var date: Date = Date() @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode> @Binding var day: String @State var onSwitch = false @State var text = "hello" var differString: String { let calendar = Calendar.current //today1は今日の日付 let today1 = Date() let today2 = calendar.dateComponents([.year, .month, .day], from: today1) let today3 = calendar.date(from: DateComponents(year: today2.year, month: today2.month, day: today2.day))! let date2 = calendar.dateComponents([.year, .month, .day], from: date) let date3 = calendar.date(from: DateComponents(year: date2.year, month: date2.month, day: date2.day))! let result = calendar.dateComponents([.day], from: date3, to: today3) return "\(result.day!)" } func set(_: Any?, forKey:String){ } var body: some View { HStack{ VStack{ Text("When did you start this food style?") .font(.title2) CalendarTestView(selectedDate: $date) .frame(height: 400) HStack(){ Text(differString) .font(.title) .padding() .foregroundColor(Color(red: 0.324, green: 0.758, blue: 0.49)) Text("Days") .font(.title2) } Button(action: { //ここでdayに値代入! day = differString UserDefaults.standard.set(self.differString, forKey: "String") func StringToDate(dateValue: String, format: String) -> Date { let dateFormatter = DateFormatter() dateFormatter.calendar = Calendar(identifier: .gregorian) dateFormatter.dateFormat = format return dateFormatter.date(from: dateValue) ?? Date() } date = StringToDate(dateValue: differString, format: "yyyy/MM/dd") self.onSwitch.toggle() self.presentationMode.wrappedValue.dismiss() }) { Text("confirm") .font(.title2) .padding(16) .background(Color(red: 0.324, green: 0.758, blue: 0.49)) .foregroundColor(Color.white) .cornerRadius(10) } } }.navigationTitle("Day Setting") } } struct CalendarTestView_Previews: PreviewProvider { static var previews: some View { CalendarApealView(day: .constant("12")) } }

補足情報(FW/ツールのバージョンなど)

macOS バージョン12.3.1
2.6 GHz 6コアIntel Core i7
Xcodeバージョン13.3.1

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています