如何在swift中使用EventKit保存和删除日历事件

问题描述 投票:0回答:2

我对 swift 还很陌生,我一直在尝试使用 EventKit 和 EventKitUI 创建和删除日历事件,到目前为止,我已经能够 create 事件,但我很难delete 它们。如果您有任何指示,请告诉我!这是我到目前为止的 ViewController 代码:

import EventKit
import EventKitUI

class ViewController: UIViewController, EKEventViewDelegate {
    
    let store = EKEventStore()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(didTapAdd))

    }
    
    @objc func didTapAdd(){
        
        store.requestAccess(to: .event) {[weak self] success, error in
            if success, error == nil {
                DispatchQueue.main.async {
                    guard let store = self?.store else { return }
                    
                    // Describes the event to be added
                    let newEvent = EKEvent(eventStore: store)
                    newEvent.title = "My Event"
                    newEvent.startDate = Date()
                    newEvent.endDate = Date()
                    
                    // Lets user edit the event themselves, we dont want this?
                    //let otherVC = EKEventEditViewController()
                    //otherVC.eventStore = store
                    //otherVC.event = newEvent
                    //self?.present(otherVC,
                                  //animated: true,
                                  //completion: nil)
                    
                    let vc = EKEventViewController()
                    vc.delegate = self
                    vc.event = newEvent
                    let navVc = UINavigationController(rootViewController: vc)
                    self?.present(navVc, animated: true)
                }
            }
        }
    }

    
    func eventViewController(_ controller: EKEventViewController, didCompleteWith action: EKEventViewAction) {
        controller.dismiss(animated: true, completion: nil)
    }

    
}
swift xcode eventkit
2个回答
0
投票

首先在启动应用程序时执行

requestAccess
一次

其次,在代码中您创建了一个新事件,但没有将其保存在商店中。

你必须打电话

try eventStore.save(newEvent, commit: true)

删除工作非常相似。您需要对

EKEvent
实例的引用,然后调用

try eventStore.remove(event, commit: true)

要获取实例,请使用

predicateForEvents(withStart:end:calendars:)
events(matching:)


0
投票

正如 vadian 所说,尝试仅在实例中请求访问一次 - 每次打开应用程序时检查访问权限是有意义的。一旦删除,您可能无法更改访问权限,但您可以告诉用户为什么它不起作用。

我创建了两个函数:创建事件和删除事件。也许你可以使用它们:

var createdEvent: EKEvent?
func createCalendarEvent() {
        
        eventStore.requestAccess(to: .event) { (granted, error) in
            if granted && error == nil {
                
                let event = EKEvent(eventStore: self.eventStore)
                event.title = "The guide worked 😮"
                event.startDate = Date()
                event.endDate = Date().addingTimeInterval(7200)
                
                event.notes = "Follow more guides on softwareanders.com and create more apps."
                
                
                event.calendar = self.eventStore.defaultCalendarForNewEvents
                
                
                do {
                    try self.eventStore.save(event, span: .thisEvent)
                    
                    self.createdEvent = event
                } catch {
                    print("Error saving event: \(error.localizedDescription)")
                }
            } else {
                print("Access to calendar not granted or an error occurred.")
            }
        }
    }


func deleteEventById(eventId: String) {
if let eventToDelete = eventStore.event(withIdentifier: eventId) {
    do {
        try eventStore.remove(eventToDelete, span: .thisEvent)
    } catch {
        print("Error deleting event: \(error.localizedDescription)")
    }
}

}

如果您想了解有关 EventKit 的更多信息,我已经制作了一份指南,您可以在其中创建、删除、编辑、获取一个和获取所有 - 链接在此处

© www.soinside.com 2019 - 2024. All rights reserved.