大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

Widget作成メモ(8)ーカレンダーイベントのリスト要素の表示

著者:川上洋
公開日:2020/12/03
最終更新日:2020/12/03
カテゴリー:技術情報 雑記

こんにちは。川上です。

さて、カレンダーイベントのリスト要素取得表示のI/Fの続きからです。

前回分のカレンダーイベントの許可認識処理を組み込んでの、今日明日のカレンダーイベント項目の取得処理。
ダァーと、一気に、記載しますwね

// MARK: - ⭐️ +++ カレンダーイベントの取得
 static func getCalenderEventStr() -> String {
     var dstr = "今日明日の予定は\nありません。"
     let weekstr :[String] = [ "日", "月", "火", "水", "木", "金", "土"]
     
     // ユーザーにカレンダーの使用の許可を求める.
     let bret = allowAuthorization()
     if bret == false {
        print(#function + "error")
         return "err-無し"
     }

     // NSCalendarを生成.
     let myCalendar: NSCalendar = NSCalendar.current as NSCalendar

     // 終了日(一年後)コンポーネントの生成.
     let oneYearFromNowComponents: NSDateComponents = NSDateComponents()
     oneYearFromNowComponents.year = 1
     // 開始日(昨日)コンポーネントの生成.
     let oneDayAgoComponents: NSDateComponents = NSDateComponents()
             oneDayAgoComponents.day = -1

     // 今日から一年後までのNSDateを生成.
     let oneYearFromNow: NSDate = myCalendar.date(byAdding: oneYearFromNowComponents as DateComponents,
          to: NSDate() as Date,
         options: NSCalendar.Options.matchLast)! as NSDate
     

     // 昨日から今日までのNSDateを生成.
     let oneDayAgo: NSDate = myCalendar.date(byAdding: oneDayAgoComponents as DateComponents,
                                             to: NSDate() as Date,
           options: NSCalendar.Options.matchLast)! as NSDate

     // イベントストアのインスタンスメソッドで述語を生成.
     var predicate = NSPredicate()
     predicate = myEventStore.predicateForEvents(withStart: oneDayAgo as Date,
                                                 end: oneYearFromNow as Date,
                 calendars: nil)
     // カレンダーイベント のListの表示
     let events = myEventStore.events(matching: predicate)
     // 発見したイベントを格納する配列を生成.
     var eventEKItems = [EKEvent]()
     // イベントが見つかった.
     // -- 今日
     let nowdaystr = CF_Lib.convertNSDateToString(date: Date() as NSDate)
     // -- 明日
     let towdate = Calendar.current.date(byAdding: .day, value: 1, to:  Date())!
     let towdaystr = CF_Lib.convertNSDateToString(date: towdate as NSDate)
     
     if !events.isEmpty {
         for evt in events {
             let curdate = evt.startDate
             let curstr = CF_Lib.convertNSDateToString(date: curdate! as NSDate)
             
             // Today Event
             if nowdaystr == curstr
                 || towdaystr == curstr {
                 eventEKItems.append(evt)  
             } //nowdaystr == curstr
         } // for evt in events

         // +++ 今日のイベント
         if eventEKItems.count > 0 {
             dstr = ""
             var dspnum = 0
             print("--- eventEKItems.count = \(eventEKItems.count)")
             for (_,evt) in eventEKItems.enumerated() {
                 
                 //日付の文字列をDate型にする
                 let date1 = Date()
                 let date2 = evt.endDate
                 // NSDate(日時)の比較
                 if ( date1.compare(date2!) == .orderedDescending ) {
                     print("date1が後")
                     continue
                 }
                 
                 if dspnum > 1 {
                     dstr += "..他"
                     break
                 }
                 
                 let today_tpl = CF_Lib.convertNSDateToYMDHMS_Weekday(date: date1 as NSDate)

                 let curdate = evt.startDate
                 let getstr = evt.title.description
                 print(getstr)
                 let day_tpl = CF_Lib.convertNSDateToYMDHMS_Weekday(date: curdate! as NSDate)
                 var day_str = String(format: "・ %02d/%02d(%@) %02d:%02d\n",
                                      day_tpl.mth
                                      ,day_tpl.day
                                      ,weekstr[day_tpl.weekday]
                                      ,day_tpl.hh
                                      ,day_tpl.min)
                 if today_tpl.day == day_tpl.day {
                     day_str = String(format: "⭐️%02d/%02d(%@) %02d:%02d\n",
                                          day_tpl.mth
                                          ,day_tpl.day
                                          ,weekstr[day_tpl.weekday]
                                          ,day_tpl.hh
                                          ,day_tpl.min)
                 }
                 
                 // --- Date disp
                 dstr += day_str
                 
                 // ---- Title disp
                 let from = getstr.index(getstr.startIndex, offsetBy:0)
                 let to = getstr.index(getstr.startIndex, offsetBy: getstr.count >= 10 ? 10 :  getstr.count)
                 let newString = String(getstr[from..<to])
                 dstr += " " + newString + ".."
                 dstr += "\n"

                 dspnum += 1
             } // for evt in eventEKItems
         } // / +++ 今日のイベント
     } // if !events.isEmpty

     if dstr == "" {
         dstr = "今日明日の予定は\nありません。"
     }
     return dstr
 } // +++ getCalenderEventStr()

「今日明日のカレンダーイベント項目の取得処理」IF
CFLib_Mgr.getCalenderEventStr()
を、Widgetの表示メンバにくっつけます。

// MARK: ⚡️ == タイムラインを定義
    func getTimeline(・・) {

			・・・・・・
			
            let entry = SimpleEntry(date: entryDate,
                                    configuration: configuration
                        ,myDayString: CFLib_Mgr.getTodayString()
                        ,myCalenderString:CFLib_Mgr.getCalenderEventStr()) // ← カレンダイベントの表示
            
            ・・・・
    }

の結果、

と、なりました。

・・・・ 次回は、お・ま・けのWidget表示処理が少々。。
ではでは。

    上に戻る