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

标签 ios swift uitableview calendar eventkit

我对 Swift 有点陌生,但真的很感兴趣。 我想获取我存储在名为“工作”的日历中的所有事件,并将它们显示在 tableView 中。 我一直在寻找这样的问题,但那里显示的代码似乎有点旧而且不能正常工作。我怎么做? tableView 应该能够显示标题、开始和结束日期。是否有可能像字符串数组中的所有标题一样。开头和结尾一样吗? 得到一些提示会很棒!

更新: 我在类外声明了变量。 现在我尝试了一个看起来像这样的代码,多亏了我在这里得到的答案,但是我没有让单元格显示任何东西?!是的,我已经在模拟器上的工作日历中创建了一个测试事件。

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

关于ios - 如何从日历中获取所有事件(Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33618685/

相关文章:

IOS:WebView中VoiceOver改成英文

swift - Google map 显示 cocoa pod 错误

ios - 在 UITableViewCell 上重新渲染 subview 的最佳实践

ios - 如何区分UITableView自定义section点击和section第一行点击?

ios - 在 tableView 中重新加载数据时出现问题

ios - 如何使用 swift 3 将 base64 编码的图像发布到服务器?

uitableview - 选择一个TableView Cell后,在Swift中将数据回传给之前的View Controller

ios - headerView 的 UITableView contentOffset 未对齐

ios - 从Combine框架使用CombineLatest时“Extra argument”错误

swift - 无法在 gCloud 中部署 Swift Vapor 应用程序