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

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

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

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

解決済

配列の保存方法と追加方法が分かりません。

uAd30HzDXwVQVwb
uAd30HzDXwVQVwb

総合スコア4

Swift

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

1回答

0評価

0クリップ

201閲覧

投稿2022/06/04 16:14

編集2022/06/05 13:40

下記のコードについての質問が二つあります。
上二つのstructが分からない部分なのですが、3つ目のstructが無いと実行できないので載せています。
今回行いたいのは、カレンダーの下にある+ボタンを押して「タイトル」のTextFieldに文字を入力する。
そして、Enterキーを押した後に保存ボタンを押す。
すると、カレンダーの下にその「タイトル」が表示される。
これを、日毎に行えるようにしたいです。(日毎に自ら入力した別々のタイトルが表示されるという意味です。)

①struct CalendarPage で宣言している @State var array : [Date] = [] と @State var arraytitle : [String] = [] を再起動しても保存されたままにしたいです。@AppStorageと書くとエラーが出たので、userDefaultsでも書いたのですがViewの中だから不可能だとエラーが出ました。
どのような仕様にすれば良いでしょうか?

②初回のタイトル保存は出来るのですが、別の日を選択して行おうとするとTextFieldに入力はできるものの、カレンダーの下に表示されません。
struct SecondView にある @State var new = "" を毎回初期化が必要なのかとも考えましたが、その方法も分かりません。
どうすれば、その日毎に入力したタイトルを表示出来るのでしょうか?

質問が2つもありお手数をおかけしますが、よろしくお願いします。

swift

import FSCalendar import CalculateCalendarLogic struct CalendarPage:View{ @State private var show: Bool = false @State var selectedDate = Date() @State var array : [Date] = [] @State var arraytitle : [String] = [] var body: some View{ VStack{ Calendarpage(selectedDate:$selectedDate).frame(height:360) HStack{ Text(selectedDate,style:.date).padding() Spacer() Button(action:{self.show = true}){ Text("+").font(.largeTitle).frame(width:50) }.sheet(isPresented:self.$show){ SecondView(show:$show,selectedDate:$selectedDate,array:$array,arraytitle:$arraytitle) } } if(array.count == 0){ } else{ ForEach(0..<array.count){index in if(array[index] == selectedDate){ Text("\(arraytitle[index])") } } } Spacer() } } } struct SecondView: View { @Binding var show:Bool @Binding var selectedDate:Date @Binding var array:[Date] @Binding var arraytitle:[String] @State var new = "" var body: some View { VStack { HStack{ Spacer() Button(action:{array.append(selectedDate);self.show.toggle()}){Text("保存")}.frame(width:75,height:75) } HStack{ Text("タイトル") TextField("",text:$new,onCommit:{arraytitle.append(new)}).overlay(RoundedRectangle(cornerRadius:1).stroke(Color.black, lineWidth:1)) } Spacer() } } } struct Calendarpage: UIViewRepresentable { @Binding var selectedDate:Date func makeUIView(context: Context) -> UIView { typealias UIViewType = FSCalendar let fsCalendar = FSCalendar() fsCalendar.delegate = context.coordinator fsCalendar.dataSource = context.coordinator fsCalendar.appearance.headerTitleFont = UIFont.systemFont(ofSize: 20) fsCalendar.appearance.weekdayFont = UIFont.systemFont(ofSize: 20) fsCalendar.appearance.titleFont = UIFont.systemFont(ofSize: 16, weight: UIFont.Weight.bold) fsCalendar.appearance.headerDateFormat = "yyyy/MM" fsCalendar.appearance.todayColor = .gray fsCalendar.appearance.selectionColor = .clear fsCalendar.appearance.borderSelectionColor = .blue fsCalendar.appearance.titleSelectionColor = .black fsCalendar.appearance.borderRadius = 0 return fsCalendar } func updateUIView(_ uiView: UIView, context: Context) { } func makeCoordinator() -> Coordinator { return Coordinator(self) } class Coordinator: NSObject, FSCalendarDelegateAppearance, FSCalendarDataSource{ var parent : Calendarpage init(_ parent: Calendarpage) { self.parent = parent } func calendar(_ calendar:FSCalendar, didSelect date:Date, at monthPosition:FSCalendarMonthPosition){ parent.selectedDate = date } func judgeHoliday(_ date : Date) -> Bool { // 祝日判定を行い結果を返すメソッド(True:祝日) let tmpCalendar = Calendar(identifier: .gregorian) //祝日判定用のカレンダークラスのインスタンス let year = tmpCalendar.component(.year, from: date) //祝日判定を行う年を取得 let month = tmpCalendar.component(.month, from: date) //祝日判定を行う月を取得 let day = tmpCalendar.component(.day, from: date) //祝日判定を行う日を取得 let holiday = CalculateCalendarLogic() //祝日判定のインスタンスの生成 return holiday.judgeJapaneseHoliday(year: year, month: month, day: day) } func getDay(_ date:Date) -> (Int,Int,Int){ //年月日をIntで取得 let tmpCalendar = Calendar(identifier: .gregorian) let year = tmpCalendar.component(.year, from: date) let month = tmpCalendar.component(.month, from: date) let day = tmpCalendar.component(.day, from: date) return (year,month,day) } func getWeekIdx(_ date: Date) -> Int{ //曜日判定(日曜日:1 〜 土曜日:7) let tmpCalendar = Calendar(identifier: .gregorian) return tmpCalendar.component(.weekday, from: date) } func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, titleDefaultColorFor date: Date) -> UIColor? { //土日や祝日の日の文字色を変える if self.judgeHoliday(date){ //祝日判定をする(祝日は赤色で表示する) return UIColor.red } let weekday = self.getWeekIdx(date) //土日の判定を行う(土曜日は青色、日曜日は赤色で表示する) if weekday == 1 { //日曜日 return UIColor.red } else if weekday == 7 { //土曜日 return UIColor.blue } return nil } } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Swift

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