如何从日历中获取所有事件(Swift)



我对Swift有点陌生,但真的很感兴趣。我想把我存储在名为"工作"的日历中的所有事件都显示在tableView中。我一直在寻找这样的问题,但那里显示的代码似乎有点旧,并没有真正起作用。我该怎么做?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
}

您可以尝试类似的

import EventKit
var titles : [String] = []
var startDates : [Date] = []
var endDates : [Date] = []
var store = EKEventStore()
let calendars = store.calendars(for: .event)
for calendar in calendars {
    if calendar.title == "Work" {
        let oneMonthAgo = Date(timeIntervalSinceNow: -30*24*3600)
        let oneMonthAfter = Date(timeIntervalSinceNow: 30*24*3600)
        let predicate =  store.predicateForEvents(withStart: oneMonthAgo, end: oneMonthAfter, calendars: [calendar])
        
        let events = store.events(matching: predicate)
        
        for event in events {
            titles.append(event.title)
            startDates.append(event.startDate)
            endDates.append(event.endDate)
        }
    }
}

(用Swift 5 API更新)

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)
        }
    }
}

最新更新