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

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

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

Q&A

解決済

1回答

406閲覧

カレンダー日選択時の他日の反応を無くしたいです。

uAd30HzDXwVQVwb

総合スコア4

0グッド

0クリップ

投稿2022/06/11 06:44

編集2022/06/12 18:48

下記コードについて質問があります。長いコード失礼します。
日付を押すとその日が選択されるのですが、他の日が一瞬色付きます。
これを光らないようにしたいです。
お力をお貸しいただきたいです。よろしくお願いします。

swift

1import SwiftUI 2import FSCalendar 3 4struct CalendarPage2:View{ 5 @State var show: Bool = false 6 @State var selectedDate = Date() 7 @State var array : [Date] 8 @State var s = 0 9 @State var m1 = Date() 10 @State var m2 = Date() 11 @State var sortarrays:[Sortarray] 12 13 14 var body: some View{ 15 ScrollView{ 16 VStack{ 17 Calendarpage(selectedDate:$selectedDate,array:$array).frame(height:360) 18 Text(selectedDate,style:.date).padding() 19 Button(action:{self.show = true;m1=selectedDate;m2=selectedDate}){Text("+")}.sheet(isPresented:self.$show){ 20 SecondView(show:$show,selectedDate:$selectedDate,array:$array,newstart:$m1,newfinish:$m2,sortarrays:$sortarrays,s:$s) 21 } 22 if(array.count == 0){ 23 } 24 else{ 25 ForEach(0..<array.count, id:\.self){index in 26 if let savedValue = UserDefaults.standard.data(forKey: "sortkey") { 27 let decoder = JSONDecoder() 28 if let arraysort = try? decoder.decode([Sortarray].self, from: savedValue) { 29 if(equals(arraysort[index].arraystart,arraysort[index].arrayfinish,selectedDate)){ 30 Text("\(arraysort[index].arraystart,style: .time)\(arraysort[index].arrayfinish,style: .time)") 31 Text("\(arraysort[index].arraytitle)") 32 Text("\(arraysort[index].arraymemo)") 33 } 34 } 35 } 36 } 37 } 38 } 39 } 40 } 41 init() { 42 let a = UserDefaults.standard.array(forKey: "arraykey") as? [Date] ?? [] 43 let so = UserDefaults.standard.array(forKey: "sortkey") as? [Sortarray] ?? [] 44 _array = State(initialValue: a) 45 _sortarrays = State(initialValue: so) 46 } 47 func equals(_ date1: Date, _ date2: Date,_ date3: Date) -> Bool { 48 let calendar = Calendar.current 49 let components1 = calendar.dateComponents([.year, .month, .day], from: date1) 50 let components2 = calendar.dateComponents([.year, .month, .day], from: date2) 51 let components3 = calendar.dateComponents([.year, .month, .day], from: date3) 52 if(components1 == components2 && components2 == components3){ 53 return true 54 } 55 else{ 56 return false 57 } 58 } 59} 60struct Sortarray:Codable{ 61 var arraytitle : String 62 var arraymemo : String 63 var arraystart : Date 64 var arrayfinish : Date 65} 66struct SecondView: View { 67 @Binding var show:Bool 68 @Binding var selectedDate:Date 69 @Binding var array:[Date] 70 @Binding var newstart:Date 71 @Binding var newfinish:Date 72 @Binding var sortarrays:[Sortarray] 73 @Binding var s:Int 74 @State var newarray : [Date]=[] 75 @State var newtitle = "" 76 @State var newmemo = "" 77 78 79 var body: some View { 80 Button(action:{save();s=1;self.show.toggle()}){Text("保存")} 81 Text("タイトル") 82 TextField("",text:$newtitle) 83 Text("メモ") 84 TextEditor(text:$newmemo) 85 DatePicker("開始時間",selection:$newstart) 86 DatePicker("終了時間",selection:$newfinish) 87 } 88 func save() { 89 if(s==0){ 90 for index in 0..<array.count{ 91 if let savedValue = UserDefaults.standard.data(forKey: "sortkey") { 92 let decoder = JSONDecoder() 93 if let arraysort = try? decoder.decode([Sortarray].self, from: savedValue) { 94 sortarrays.append(Sortarray(arraytitle:arraysort[index].arraytitle,arraymemo:arraysort[index].arraymemo,arraystart:arraysort[index].arraystart,arrayfinish:arraysort[index].arrayfinish)) 95 } 96 } 97 } 98 } 99 else{ 100 } 101 sortarrays.append(Sortarray(arraytitle:newtitle,arraymemo:newmemo,arraystart:newstart,arrayfinish:newfinish)) 102 sortarrays.sort(by: {$1.arraystart > $0.arraystart}) 103 let encoder = JSONEncoder() 104 if let encodedValue = try? encoder.encode(sortarrays) { 105 UserDefaults.standard.set(encodedValue, forKey: "sortkey") 106 } 107 array.append(selectedDate) 108 UserDefaults.standard.set(array, forKey: "arraykey") 109 } 110} 111 112struct Calendarpage: UIViewRepresentable { 113 @Binding var selectedDate:Date 114 @Binding var array:[Date] 115 116 117 func makeUIView(context: Context) -> UIView { 118 typealias UIViewType = FSCalendar 119 let fsCalendar = FSCalendar() 120 fsCalendar.dataSource = context.coordinator 121 fsCalendar.delegate = context.coordinator 122 return fsCalendar 123 } 124 func updateUIView(_ uiView: UIView, context: Context) { 125 guard let v = uiView as? FSCalendar else{return} 126 context.coordinator.array = array 127 v.reloadData() 128 } 129 func makeCoordinator() -> Coordinator { 130 return Coordinator(self,array:array) 131 } 132 133 134 class Coordinator: NSObject,FSCalendarDataSource, FSCalendarDelegate{ 135 var array:[Date] 136 var parent : Calendarpage 137 138 139 init(_ parent: Calendarpage,array:[Date]) { 140 self.parent = parent 141 self.array = array 142 } 143 144 145 func calendar(_ calendar:FSCalendar, didSelect date:Date, at monthPosition:FSCalendarMonthPosition){ 146 parent.selectedDate = date 147 } 148 func calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date) -> Int { 149 if array.contains(date) { 150 return 1 151 } else { 152 return 0 153 } 154 } 155 } 156} 157 158struct CalendarPage_Previews: PreviewProvider { 159 static var previews: some View { 160 Group{ 161 CalendarPage2() 162 } 163 } 164} 165

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

すみません、回答ではないのですが、コードを含めたかったので回答欄に入力してみます。
*今後、少しでもご自身で問題解決できるようになればと思い、途中ですが入力してみました

質問欄には問題が再現する最小限のコードを記載すると良いと思います。
*コピペですぐに再現確認できる状態にすると良いと思います(Swiftは回答している人が少ない印象で、FSCalendarなどのパッケージを使っているとさらに少ない印象ですので、最小限でコピペですぐに試せるコードの方が回答してもらいやすくなるのかなという印象です)
*本来の(実際の)コードから最小限になるようにコードに削除していくうちに、ご自身で原因を見つけて問題解決できるかもしれません

関係なさそうなところを削除してみたコードです。

swift

1import SwiftUI 2import FSCalendar 3struct CalendarPage2:View{ 4 @State var selectedDate = Date() 5 var body: some View{ 6 ScrollView{ 7 VStack{ 8 Calendarpage(selectedDate:$selectedDate).frame(height:360) 9 Text(selectedDate,style:.date).padding() // 原因1?コメントアウトすると解消されます 10 } 11 } 12 } 13} 14struct Calendarpage: UIViewRepresentable { 15 @Binding var selectedDate:Date 16 func makeUIView(context: Context) -> UIView { 17 typealias UIViewType = FSCalendar 18 let fsCalendar = FSCalendar() 19 fsCalendar.dataSource = context.coordinator 20 fsCalendar.delegate = context.coordinator 21 return fsCalendar 22 } 23 func updateUIView(_ uiView: UIView, context: Context) { 24 guard let v = uiView as? FSCalendar else{return} 25 // calendar(_:numberOfEventsFor:)を再読み込みするためにreloadDataしています 26 v.reloadData() // 原因2?コメントアウトすると解消されます 27 } 28 func makeCoordinator() -> Coordinator { 29 return Coordinator(self) 30 } 31 class Coordinator: NSObject,FSCalendarDataSource,FSCalendarDelegate{ 32 var parent : Calendarpage 33 init(_ parent: Calendarpage) { 34 self.parent = parent 35 } 36 func calendar(_ calendar:FSCalendar, didSelect date:Date, at monthPosition:FSCalendarMonthPosition){ 37 parent.selectedDate = date 38 } 39 func calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date) -> Int { 40 // 本来はデータソースに対する結果を返します 41 return 0 42 } 43 } 44}

今回の問題について、今のところ2つ原因のようなコードを見つけたのですが、
v.reloadData()はイベントの点を再読み込みする際に追加したコードが影響してしまったようですね・・

もう一つのText(selectedDate,style:.date)はselectedDateをバインディングで使用しているわけではないと思いますので、
なぜ影響しているのかまだわかりません・・
でも先にこちらを調査してみると良いのかもしれないと思っています。
*表示方法を変えると解消できるのかとか試してみるのも良いかもしれません

投稿2022/06/12 01:58

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uAd30HzDXwVQVwb

2022/06/12 09:48

丁寧な質問へのご回答、そして質問へのアドバイス誠にありがとうございます! 今後の参考にさせていただきます。 リロードの影響だと考えており、他の再読み込みを調べていましたがTextの可能性があったのですね。 リロードは行いたいので、Textで解決できるようにいろいろ試してみます。 今回もお世話になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問