【问题标题】:How to fetch the events from local calendar in iOS swift如何在 iOS swift 中从本地日历中获取事件
【发布时间】:2023-02-21 13:17:53
【问题描述】:
func fetchEvent()
    {
    
        var store = EKEventStore()

        let calendars = store.calendars(for: .event)

        for calendar in calendars {

                let oneMonthAgo =  Date()
                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)
             }
    }

[I] 使用此代码从我的本地日历中获取存储的事件。我在我的本地日历中存储了许多事件,但在事件中它总是 0 元素。所以任何人都请帮助我。

【问题讨论】:

  • 1) 您是否有权访问日历? 2) 外部 for 循环不是必需的,谓词采用日历数组 3) 不要做 86400 日期数学,使用 Calendar API

标签: ios swift ekeventkit


【解决方案1】:

首先,不要忘记通过添加新行来使用 NSCalendarsUsageDescription 更新您的 Info.plist:

  • 钥匙:《隐私-日历使用说明》
  • 价值:“请授予访问权限”——这取决于你

你的 ViewController 应该看起来像这样:

import UIKit
import EventKit

final class ViewController: UIViewController {
    let eventStore = EKEventStore()
    var titles: [String] = []
    var startDates: [Date] = []
    var endDates: [Date] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        fetchEventsFromCalendar()
    }

    func fetchEventsFromCalendar() -> Void {
        let status = EKEventStore.authorizationStatus(for: EKEntityType.event)
        switch status {
        case .notDetermined: requestAccessToCalendar("Calendar")
        case .authorized: fetchEventsFromCalendar("Calendar")
        case .denied: print("Access denied")
        default: break
        }
    }

    func requestAccessToCalendar(_ calendarTitle: String) {
        eventStore.requestAccess(to: EKEntityType.event) { (_, _) in
            self.fetchEventsFromCalendar(calendarTitle)
        }
    }

    func fetchEventsFromCalendar(_ calendarTitle: String) -> Void {
        for calendar in eventStore.calendars(for: .event) {
            if calendar.title == calendarTitle {
                let oneMonthAgo = Calendar.current.date(byAdding: .month, value: -1, to: Date()) ?? Date()
                let oneMonthAfter = Calendar.current.date(byAdding: .month, value: 1, to: Date()) ?? Date()
                let predicate = eventStore.predicateForEvents(
                    withStart: oneMonthAgo,
                    end: oneMonthAfter,
                    calendars: [calendar]
                )
                let events = eventStore.events(matching: predicate)
                for event in events {
                    titles.append(event.title)
                    startDates.append(event.startDate as Date)
                    endDates.append(event.endDate as Date)
                }
            }
        }

        // Print the event titles so check if everything works correctly
        print(titles)
    }

}

您将首先检查fetchEventsFromCalendar() 中的日历访问,实际事件提取将在fetchEventsFromCalendar() 中处理。

一件事:在这个特定的例子中,我们在一个名为“日历”.如果你想从所有日历中获取那段时间的事件,你可以简单地删除

            if calendar.title == calendarTitle {

行(包括右括号和与calendarTitle 相关的所有内容)。您将拥有所有事件的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多