简体   繁体   English

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

[英]How to get all Events out of a Calendar (Swift)

I am kinda new to Swift, but really interested.我对 Swift 有点陌生,但真的很感兴趣。 I would like to get all the events I stored in a Calendar called "Work" and show them in a tableView.我想获取我存储在名为“工作”的日历中的所有事件,并将它们显示在 tableView 中。 I was looking for questions like this, but the code shown there seems to be kinda old and not really working.我一直在寻找这样的问题,但是那里显示的代码似乎有点旧并且不能正常工作。 How do I do that?我怎么做? The tableView should be able to show the Title, start and end-Date. tableView 应该能够显示标题、开始和结束日期。 Is it possible to get like all Titles in an Array of Strings.是否有可能获得字符串数组中的所有标题。 Same with the start and end?开头和结尾一样吗? Would be awesome to get some tips!得到一些提示会很棒!

Update: I declared the variables outside the class.更新:我在类外声明了变量。 Now I tried a code that looks like this, thanks to an answer I got here, but I don't get the cells to display anything?!现在我尝试了一个看起来像这样的代码,感谢我在这里得到的答案,但我没有让单元格显示任何内容?! And Yes I already created a testEvent in my Work calendar on the simulator.是的,我已经在模拟器的工作日历中创建了一个 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
}

You can try something like this你可以试试这样的

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

Swift 3.0斯威夫特 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)
        }
    }
}
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)")
        
        }
    }
    
}

Make sure to give the proper title of the calendar, because different calendars have different list of events, In my case calendar with title "Calendar" was having the required events list, before giving check for this:确保给出正确的日历标题,因为不同的日历有不同的事件列表,在我的例子中,标题为“日历”的日历具有所需的事件列表,然后再检查:

if calendar.title == calendarTitle {

My first list was getting overrides by list from other calendar, so I used to get only few events which were not relevant to me.我的第一个列表是从其他日历中按列表获取覆盖,所以我过去只获取与我无关的少数事件。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM