【问题标题】:How to get all Events out of a Calendar (Swift)如何从日历中获取所有事件(Swift)
【发布时间】:2015-11-09 21:30:55
【问题描述】:

我对 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
}

【问题讨论】:

    标签: ios swift uitableview calendar eventkit


    【解决方案1】:

    你可以试试这样的

    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 更新)

    【讨论】:

    • 谢谢你的帮助,我去试试!
    • 我终于尝试了,但它给了我一个错误:获取所有日历时出错:Error Domain=EKCADErrorDomain Code=1013 "(null)" 我现在需要做什么?
    • 好的,我摆脱了这个错误,但我仍然无法获取事件?你能检查一下我现在有什么吗,我更新了原帖!
    • 三个数组中的任何一个都有吗?你有什么events calendar 得到了什么?
    • 我刚刚检查了日历中是否有任何内容并且打印了很长的文本......但我将:“if calendar.source.title”更改为:“if calendar.title”,现在它似乎工作!感谢您的回答,这让我检查了数组中的内容(实际上我应该在自己之前想到这一点:D)
    【解决方案2】:
    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 {
    

    我的第一个列表被其他日历的列表覆盖,所以我过去只获得与我不相关的少数事件。

    【讨论】:

    • 还有一件事,在某些地方初始化 'eventStore',如 let eventStore = EKEventStore()
    【解决方案3】:

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

    【讨论】:

    • 你在 swift @Abhishek Jain 中使用过谷歌日历
    • 没有@DilipTiwari
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2023-02-21
    • 2011-08-18
    • 2012-02-12
    • 2021-06-02
    相关资源
    最近更新 更多