Как получить все события из календаря (Swift)

Я новичок в Swift, но очень заинтересован. Я хотел бы получить все события, которые я сохранил в Календаре под названием "Работа", и показать их в табличном представлении. Я искал подобные вопросы, но код, показанный там, вроде бы старый и не очень работает. Как я могу это сделать? TableView должен быть в состоянии показать заголовок, дату начала и окончания. Возможно ли получить как все названия в массиве строк. То же самое с началом и концом? Было бы здорово получить несколько советов!

Обновление: я объявил переменные вне класса. Теперь я попробовал код, который выглядит следующим образом, благодаря полученному здесь ответу, но я не получаю, чтобы ячейки отображали что-либо?! И да, я уже создал testEvent в своем рабочем календаре на симуляторе.

    override func viewDidAppear(animated: Bool) {

    let eventStore = EKEventStore()

    switch EKEventStore.authorizationStatusForEntityType(.Event) {
    case .Authorized:
        readEvents()
    case .Denied:
        print("Access denied")
    case .NotDetermined:

        eventStore.requestAccessToEntityType(.Event, completion: { (granted: Bool, NSError) -> Void in
            if granted {
                self.readEvents()

            }else{
                print("Access denied")
            }



        })
    default:
        print("Case Default")
    }
    self.tableView.reloadData()
}



func readEvents() {



    let eventStore = EKEventStore()
    let calendars = eventStore.calendarsForEntityType(.Event)

    for calendar in calendars {
        if calendar.source.title == "Work" {
            let oneMonthAgo = NSDate(timeIntervalSinceNow: -30*24*3600)
            let oneMonthAfter = NSDate(timeIntervalSinceNow: +30*24*3600)


            let predicate = eventStore.predicateForEventsWithStartDate(oneMonthAgo, endDate: oneMonthAfter, calendars: [calendar])

            var events = eventStore.eventsMatchingPredicate(predicate)

            for event in events {

                titles.append(event.title)
                startDates.append(event.startDate)
                endDates.append(event.endDate)


            }

        }
    }


}

// MARK: - Table view data source



override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return titles.count
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)


    cell.textLabel!.text = titles[indexPath.row]
    cell.detailTextLabel!.text = "From: \(startDates[indexPath.row]) Until: \(endDates[indexPath.row])"
    // Configure the cell...

    return cell
}

3 ответа

Вы можете попробовать что-то вроде этого

    import EventKit

    var titles : [String] = []
    var startDates : [NSDate] = []
    var endDates : [NSDate] = []

    let eventStore = EKEventStore()
    let calendars = eventStore.calendarsForEntityType(.Event)

    for calendar in calendars {
        if calendar.title == "Work" {

            let oneMonthAgo = NSDate(timeIntervalSinceNow: -30*24*3600)
            let oneMonthAfter = NSDate(timeIntervalSinceNow: +30*24*3600)

            let predicate = eventStore.predicateForEventsWithStartDate(oneMonthAgo, endDate: oneMonthAfter, calendars: [calendar])

            var events = eventStore.eventsMatchingPredicate(predicate)

            for event in events {
                titles.append(event.title)
                startDates.append(event.startDate)
                endDates.append(event.endDate)
            }
        }
    }
func fetchEventsFromCalendar() -> Void {
    let status = EKEventStore.authorizationStatus(for: EKEntityType.event)

    switch (status) {
    case .notDetermined:
        requestAccessToCalendar()
    case .authorized:
        self.fetchEventsFromCalendar(calendarTitle: "Calendar")
        break
    case .restricted, .denied: break

    }
}


func requestAccessToCalendar() {

    eventStore.requestAccess(to: EKEntityType.event) { (accessGranted, error) in

        self.fetchEventsFromCalendar(calendarTitle: "Calendar")

    }

}


// MARK: Fetech Events from Calendar
func fetchEventsFromCalendar(calendarTitle: String) -> Void {

    //PGAEventsCalendar
    for calendar:EKCalendar in calendars! {

        if calendar.title == calendarTitle {

        let selectedCalendar = calendar
        let startDate = NSDate(timeIntervalSinceNow: -60*60*24*180)
        let endDate = NSDate(timeIntervalSinceNow: 60*60*24*180)
        let predicate = eventStore.predicateForEvents(withStart: startDate as Date, end: endDate as Date, calendars: [selectedCalendar])
        addedEvents = eventStore.events(matching: predicate) as [EKEvent]

        print("addedEvents : \(addedEvents)")

        }
    }

}

Обязательно дайте правильное название календаря, потому что разные календари имеют разные списки событий. В моем случае календарь с заголовком "Календарь" имел требуемый список событий, прежде чем проверять это:

if calendar.title == calendarTitle {

Мой первый список получал переопределения по списку из другого календаря, поэтому я получал только несколько событий, которые не имели отношения к мне.

Swift 3.0

let eventStore = EKEventStore()
let calendars = eventStore.calendars(for: .event)

for calendar in calendars {
    if calendar.title == "Work" {

        let oneMonthAgo = NSDate(timeIntervalSinceNow: -30*24*3600)
        let oneMonthAfter = NSDate(timeIntervalSinceNow: +30*24*3600)

        let predicate = eventStore.predicateForEvents(withStart: oneMonthAgo as Date, end: oneMonthAfter as Date, calendars: [calendar])

        let events = eventStore.events(matching: predicate)

        for event in events {
            titles.append(event.title)
            startDates.append(event.startDate as NSDate)
            endDates.append(event.endDate as NSDate)
        }
    }
}
Другие вопросы по тегам