我对 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)
}
}
首先在启动应用程序时执行
requestAccess
一次。
其次,在代码中您创建了一个新事件,但没有将其保存在商店中。
你必须打电话
try eventStore.save(newEvent, commit: true)
删除工作非常相似。您需要对
EKEvent
实例的引用,然后调用
try eventStore.remove(event, commit: true)
predicateForEvents(withStart:end:calendars:)
和 events(matching:)
正如 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 的更多信息,我已经制作了一份指南,您可以在其中创建、删除、编辑、获取一个和获取所有 - 链接在此处