質問失礼します。
コレクションビューを使用してカレンダーを作成する為に、
カレンダーに表示させる一ヶ月分の日付を配列として取得したいです。
下記のURLを参考にコードを試してみたのですが、
月の初日を取得するメソッドfirstDateOfMonth()で日付を1日に設定した後、
再びcalendarのdateに戻そうとすると日付が1日戻ってprintされてしまいます。
何故日付が戻ってしまうのかという事と、
どうして日付を設定後に再度calendarクラスとして
let firstDateMonth = calendar.date(from: components)
とコードを記載しなければいけないのかが分かりませんでした。
どなたかご教授いただけますと嬉しいです。
よろしくお願い致します。
https://qiita.com/sakuran/items/3c2c9f22cbcbf4aff731
Swift
1class DateManager { 2 3 //表示する月の日付けを格納する配列 4 var currentMonthOfDates = [Date]() 5 //現在の日付 6 var selectedDate = Date() 7 //セルの列数(一週間の日付) 8 let daysPerWeek: Int = 7 9 //セルの合計数 10 var numberOfItems: Int! 11 //カレンダーの生成 12 let calendar = Calendar.current 13 14 //その月に必要なセルの数を算出するメソッド 15 func daysAcquisition() -> Int { 16 //その月から週の情報を取得している?? 17 let rangeOfWeeks = calendar.range(of: .weekOfMonth, in: .month, for: firstDateOfMonth()) 18 //月が持つ週の数を取得する 19 let numberOfWeeks = rangeOfWeeks?.count 20 //週の数×列の数で必要なセルの数を算出する 21 numberOfItems = numberOfWeeks! * daysPerWeek 22 //セルの合計数 23 return numberOfItems 24 } 25 26 //その月の初日を取得する 27 func firstDateOfMonth() -> Date { 28 //現在の日付を生成 29 var components = calendar.dateComponents([.year, .month, .day],from: selectedDate) 30 //日付を一日に設定する 31 components.day = 1 32 //year: 2020 month: 5 day: 1 isLeapMonth: false とプリントされている 33 print(components) 34 //一日に設定した日付をカレンダーのデータに戻す 35 let firstDateMonth = calendar.date(from: components) 36 //Optional(2020-04-30 15:00:00 +0000)と日付がズレてプリントされる 37 print(firstDateMonth as Any) 38 39 return firstDateMonth! 40 } 41 42 //表示する日にちの取得 43 func dateForCellAtIndexPath(numberOfItems: Int) { 44 // 「月の初日が週の何日目か」で曜日を計算する 45 let ordinalityOfFirstDay = calendar.ordinality(of: .day, in: .weekOfMonth, for: firstDateOfMonth()) 46 //曜日から1を引けばセルのindexPathとの差分が計算できる 47 let sabun = (ordinalityOfFirstDay! - 1) 48 //月の初日から差分の日数を引いた日付けからカレンダーが開始するので、indexPathの数だけ繰り返して必要な日付のデータを配列に保存する 49 for day in 0 ... numberOfItems { 50 let currentday = calendar.date(byAdding: .day, value: -sabun + day, to: firstDateOfMonth())! 51 currentMonthOfDates.append(currentday) 52 } 53 print(currentMonthOfDates) 54 } 55}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。