【问题标题】:Recurring Weekly Event in Swift iOS EventKitSwift iOS EventKit 中的周期性每周事件
【发布时间】:2016-05-09 01:16:17
【问题描述】:

我有允许在 EventKit 中创建日历事件的当前方法。

func createEvent(eventStore: EKEventStore, title: String, startDate: NSDate, endDate: NSDate) {
    let event = EKEvent(eventStore: eventStore)

    event.title = title
    event.startDate = startDate
    event.endDate = endDate
    event.calendar = eventStore.defaultCalendarForNewEvents

    do {
        try eventStore.saveEvent(event, span: .ThisEvent)
        savedEventId = event.eventIdentifier
    } catch {
        print("Bad things happened")
    }
}

但是,我希望允许用户选择一周中的几天来创建重复事件。例如,用户设置时间为上午 10:05,并选择星期一、星期三、星期四。如何制定 EventKit 以允许此事件在用户日历上正确安排?

【问题讨论】:

    标签: ios swift eventkit


    【解决方案1】:

    我看到您帖子上的时间戳早在 5 月,因此您可能不再需要帮助,但对于偶然发现此问题的其他人,您必须使用 EKRecurrenceRule class 并附上它参加活动。

    这是一个在 Objective-C 中使用它为每个星期五安排事件的示例(如您的场景):

    // The EKRecurrenceRule accepts an NSArray of day objects, I did this to make adding multiple days easier
    NSMutableArray *daysArr = [[NSMutableArray alloc] init];
    
    // Days of the week are ordered Sunday to Saturday, 1-7
    EKRecurrenceDayOfWeek *theDay = [[EKRecurrenceDayOfWeek alloc] initWithDayOfTheWeek:6 weekNumber:0];
    
    // Add Friday to the array
    [daysArr addObject:theDay];
    
    // Instantiate the EKRecurrenceRule, giving it a weekly frequency and the day of the week
    EKRecurrenceRule *recurrenceRule = [[EKRecurrenceRule alloc] initRecurrenceWithFrequency:EKRecurrenceFrequencyWeekly interval:1 daysOfTheWeek:daysArr daysOfTheMonth:nil monthsOfTheYear:nil weeksOfTheYear:nil daysOfTheYear:nil setPositions:nil end:nil];
    
    // Apply it to the event
    [event setRecurrenceRules:@[recurrenceRule]];
    

    我希望这可以帮助别人!

    【讨论】:

      【解决方案2】:

      我知道这也可能晚了,但至少它适用于 Swift 而不是 ObjC。我创建了两个函数,一个在底部创建 Date 事件,另一个创建名为 addEventToCalendar 的重复事件。请注意,您仍然需要明确具体事件是一周中的哪一天。

      如果您对活动的运作方式仍有疑问,我建议您咨询this link

      func addEventToCalendar(title: String, description: String?, startDate: Date, endDate: Date, completion: ((_ success: Bool, _ error: NSError?) -> Void)? = nil){
              let eventStore = EKEventStore()
      
              eventStore.requestAccess(to: .event, completion: { (granted, error) in
                  if (granted) && (error == nil) {
                      let event = EKEvent(eventStore: eventStore)
                      event.title = title
                      event.startDate = startDate
                      event.endDate = startDate
                      event.notes = description
                      event.calendar = eventStore.defaultCalendarForNewEvents
      
                      let recurrenceRule = EKRecurrenceRule.init(
                          recurrenceWith: .daily,
                          interval: 1,
                          daysOfTheWeek: [EKRecurrenceDayOfWeek.init(EKWeekday.saturday)],
                          daysOfTheMonth: nil,
                          monthsOfTheYear: nil,
                          weeksOfTheYear: nil,
                          daysOfTheYear: nil,
                          setPositions: nil,
                          end: EKRecurrenceEnd.init(end:endDate)
                      )
      
                      event.recurrenceRules = [recurrenceRule]
                      do {
                          try eventStore.save(event, span: .thisEvent)
                      } catch let e as NSError {
                          completion?(false, e)
                          return
                      }
                      completion?(true, nil)
                  } else {
                      completion?(false, error as NSError?)
                  }
              })
          }
      
          private func createDate(date: String!, hours: Int!, minutes:Int! ) -> Date{
              var fullDateArr = date.components(separatedBy: "-")
      
              let startMonth: Int? = Int(fullDateArr[0])!
              let startDay: Int? = Int(fullDateArr[1])!
              let startYear: Int = Int(fullDateArr[2])!
      
      
              var dateComponents = DateComponents()
              dateComponents.year = startYear
              dateComponents.month = startMonth
              dateComponents.day = startDay
              dateComponents.timeZone = TimeZone(abbreviation: "MDT") // ELP Standard Time
              dateComponents.hour = hours
              dateComponents.minute = minutes
      
              let userCalendar = Calendar.current // user calendar
              let someDateTime = userCalendar.date(from: dateComponents)
      
              return someDateTime!
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-16
        • 2014-02-05
        相关资源
        最近更新 更多