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

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

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

解決済

配列のソートと日を跨いだ表示

uAd30HzDXwVQVwb
uAd30HzDXwVQVwb

総合スコア4

1回答

0評価

0クリップ

209閲覧

投稿2022/06/09 10:07

編集2022/06/11 14:10

下記のコードについて2点ほど質問があります。
現在出来ることは、予定の追加,編集,削除,予定のある日に印付ける(なぜか一度画面を消さないと、印が付かないです。),iOSカレンダーへの追加です。
文字数の関係で切った部分があり分かりにくくてすみません。

①開始時間の早い予定を前にしたいのです。現在は予定を書いた順に表示されます。

②日を跨ぐ開始時間と終了時間を設定した場合、表示された予定がその通りに表示されるようにしたいです。自分で考えると削除や編集の時に通用しなくなってしまいます。

2つの質問、そして長いコード失礼します。お力をお貸しいただければと思います。
よろしくお願いします。

Swift

import SwiftUI import FSCalendar import CalculateCalendarLogic import EventKit struct CalendarPage:View{ @State var show:Bool=false @State var show2:Bool=false @State var isSheet:Bool=false @State var selectedDate=Date() @State var array:[Date] @State var n=0 @State var m1=Date() @State var m2=Date() @State var sortarrays:[Sortarray] var body: some View{ ScrollView{ Calendarpage(selectedDate:$selectedDate,array:$array) Text(selectedDate,style:.date).padding() Button(action:{self.show=true;m1=selectedDate;m2=selectedDate}){ Text("+")}.sheet(isPresented:self.$show){SecondView(show:$show,selectedDate:$selectedDate,array:$arraynewsta,rt:$m1,newfinish:$m2,sortarrays:$sortarrays)} if(array.count==0){ } else{ ForEach(0..<array.count, id:\.self){index in if(equals(array[index], selectedDate)){ Text("\(sortarrays[index].arraystart,style:.time)\(sortarrays[index].arrayfinish,style:.time)") Button(action: {isSheet=true}) {Text("削除")}.actionSheet(isPresented: $isSheet) { ActionSheet(title: Text("この予定を削除しますか?"), buttons: [.destructive(Text("削除"), action:{remove(index)}),.cancel(Text("キャンセル"), action: {})])} Button(action:{self.show2 = true;n=index}){Text("編集")}.sheet(isPresented:self.$show2){HenshuView(show2:$show2,selectedDate:$selectedDate,array:$array,index:$n,newtitle:$arraytitle[index],newmemo:$arraymemo[index],newstart:$arraystart[index],newfinish:$arrayfinish[index],sortarrays:$sortarrays)} Text("\(sortarrays[index].arraytitle)") Text("\(sortarrays[index].arraymemo)") } } } } } init(){ UIDatePicker.appearance().minuteInterval=5 let a=UserDefaults.standard.array(forKey:"key") as? [Date] ?? [] let sort=UserDefaults.standard.array(forKey:"sortkey") as? [Sortarray] ?? [] _array=State(initialValue:a) _sortarrays=State(initialValue:sort) } func equals(_ date1:Date, _ date2:Date)->Bool{ let calendar = Calendar.current let components1=calendar.dateComponents([.year,.month,.day],from:date1) let components2=calendar.dateComponents([.year,.month,.day],from:date2) let result = components1 == components2 return result } func remove(_ n:Int){ array.remove(at:n); sortarrays.remove(at:n) UserDefaults.standard.set(array,forKey:"key") UserDefaults.standard.set(array,forKey:"sortkey") } } struct Sortarray:Codable{ var arraytitle:String var arraymemo:String var arraystart:Date var arrayfinish:Date } struct SecondView: View{ @Binding var show:Bool @Binding var selectedDate:Date @Binding var array:[Date] @Binding var newstart:Date @Binding var newfinish:Date @Binding var sortarrays:[Sortarray] @State var newtitle="" @State var newmemo="" let eventStore=EKEventStore() var body: some View { VStack {        Button(action:{addEvent();save();self.show.toggle()}){Text("保存")} TextField("タイトル",text:$newtitle) Text("メモ") TextEditor(text:$newmemo) DatePicker("開始時間",selection:$newstart) DatePicker("終了時間",selection:$newfinish) } .onAppear(perform:self.allowAuthorization) } func allowAuthorization(){ if getAuthorization_status(){ return }else{ eventStore.requestAccess(to:.event,completion:{(granted, error) in if granted{ return } }) } } func getAuthorization_status()->Bool{ let status=EKEventStore.authorizationStatus(for:.event) switch status { case .notDetermined: print("NotDetermined") return false case .denied: print("Denied") return false case .authorized: print("Authorized") return true case .restricted: print("Restricted") return false @unknown default: literalExpression() fatalError("カレンダーの認証部分でエラー @unknown default") } } func addEvent(){ let defaultCalendar=eventStore.defaultCalendarForNewEvents let event=EKEvent(eventStore:eventStore) event.title=newtitle event.notes=newmemo event.startDate=newstart event.endDate=newfinish event.calendar=defaultCalendar do{try eventStore.save(event, span:.thisEvent) } catch let error{print(error)} } func literalExpression(){ print("__FILE__",#file) print("__LINE__",#line) print("__COLUMN__",#column) print("__FUNCTION__",#function) } func save(){ let encoder=JSONEncoder() let ej=Sortarray(arraytitle:newtitle,arraymemo:newmemo,arraystart:newstart,arrayfinish:newfinish) if let encodedValue=try? encoder.encode(ej){ sortarrays.append(ej) UserDefaults.standard.set(encodedValue,forKey:"sortkey") } array.append(selectedDate); UserDefaults.standard.set(array,forKey:"key") } } struct HenshuView: View{ @Binding var show2:Bool @Binding var selectedDate:Date @Binding var array:[Date] @Binding var index:Int @Binding var newtitle:String @Binding var newmemo:String @Binding var newstart:Date @Binding var newfinish:Date @Binding var sortarrays:[Sortarray] let eventStore=EKEventStore() var body: some View{ Button(action:{addEvent();saveremove(index);self.show2.toggle()}){Text("保存")} TextField("タイトル",text:$newtitle) Text("メモ") TextEditor(text:$newmemo) DatePicker("開始時間",selection:$newstart) DatePicker("終了時間",selection:$newfinish) } func saveremove(){ let encoder=JSONEncoder() let ej=Sortarray(arraytitle:newtitle,arraymemo:newmemo,arraystart:newstart,arrayfinish:newfinish) if let encodedValue=try? encoder.encode(ej){ sortarrays.append(ej) UserDefaults.standard.set(encodedValue,forKey:"sortkey") } array.append(selectedDate); array.remove(at:n); sortarrays.remove(at:n) UserDefaults.standard.set(array,forKey:"key") UserDefaults.standard.set(array,forKey:"sortkey") } func addEvent(){ let defaultCalendar=eventStore.defaultCalendarForNewEvents let event=EKEvent(eventStore: eventStore) event.title=newtitle event.notes=newmemo event.startDate=newstart event.endDate=newfinish event.calendar=defaultCalendar do{try eventStore.save(event,span:.thisEvent) }catch let error{print(error)} } } struct Calendarpage: UIViewRepresentable{ @Binding var selectedDate:Date @Binding var array:[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,array:$array) } class Coordinator: NSObject,FSCalendarDelegateAppearance, FSCalendarDataSource{ @Binding var array:[Date] var parent:Calendarpage init(_ parent:Calendarpage,array:Binding<[Date]>){ self.parent=parent self._array=array } func calendar(_ calendar:FSCalendar,didSelect date:Date,at monthPosition:FSCalendarMonthPosition){ parent.selectedDate=date } func calendar(_ calendar:FSCalendar,numberOfEventsFor date:Date)->Int{ if array.contains(date){ return 1 } else { return 0 } } } }

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

xg63ex2b

2022/06/09 14:05

数日の間に随分コードが進化しましたね。 > ①開始時間の早い予定を前にしたいのです。現在は予定を書いた順に表示されます。 DateやStringを個別の配列にして扱うのはちょっと大変になってきたように思います。 structにまとめて、structの配列にした方が扱いやすいと思いました。 それからstructをソートすると良いと思います。 https://developer.apple.com/documentation/swift/array/sort(by:) ②はちょっとまだ自分の理解が追いついていません・・ もうちょっとお待ちください・・
uAd30HzDXwVQVwb

2022/06/09 19:14 編集

ご返答ありがとうございます! 毎回本当にxg63ex2bさんに助けられています。 今回も私の質問に真摯に向き合っていただき感謝しております。 ①への解決方法ありがとうございます。 構造体配列に予定を追加することは出来たようですが、記入後は表示されるものの、一度アプリを閉じると表示がされない事態が起こりました。 解決に時間がかかるかもしれないので、現時点でのコードを質問文で記載します。 上手くいったり変化すれば、また新しく修正します。 面倒くさい問題を投げかけてしまいすみません。 いつまでも待ちますので、気にしないでください! 考えていただけるだけで感謝ですので。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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