Ich würde gerne wissen, wie Sie ein Kalenderereignis auf dem Gerät hinzufügen, aber mit swift. Ich weiß, dass es einige Beispiele gibt, die in Objective-C gemacht wurden, aber im Moment ist nichts schnell. Danke vielmals.So fügen Sie ein Ereignis im Gerätekalender mithilfe von swift hinzu
Antwort
Swift 3.0 Version
let eventStore : EKEventStore = EKEventStore()
// 'EKEntityTypeReminder' or 'EKEntityTypeEvent'
eventStore.requestAccess(to: .event) { (granted, error) in
if (granted) && (error == nil) {
print("granted \(granted)")
print("error \(error)")
let event:EKEvent = EKEvent(eventStore: eventStore)
event.title = "Test Title"
event.startDate = Date()
event.endDate = Date()
event.notes = "This is a note"
event.calendar = eventStore.defaultCalendarForNewEvents
do {
try eventStore.save(event, span: .thisEvent)
} catch let error as NSError {
print("failed to save event with error : \(error)")
}
print("Saved Event")
}
else{
print("failed to save event with error : \(error) or access not granted")
}
}
Referenz: https://gist.github.com/mchirico/d072c4e38bda61040f91
für die Sie weiß nicht importieren müssen: Import EventKit es –
funktioniert es gibt Fehler "Verwendung des nicht aufgelösten Bezeichners EKEntityTypeEvent". Fehle ich etwas? – Dashrath
@Dashrath Verwenden Sie 'EKEntityType.Event' (einige Änderungen in Swift 2.0) statt –
Ich konnte dies einzustellen und die Compiler-Fehler in den Kommentaren erwähnt zu beseitigen auf die Antworten oben (und einige andere), wie folgt:
var eventStore : EKEventStore = EKEventStore()
// 'EKEntityTypeReminder' or 'EKEntityTypeEvent'
eventStore.requestAccessToEntityType(EKEntityType.Event, completion: {
(granted, error) in
if (granted) && (error == nil) {
print("granted \(granted)")
print("error \(error)")
var event:EKEvent = EKEvent(eventStore: eventStore)
event.title = "Test Title"
event.startDate = NSDate()
event.endDate = NSDate()
event.notes = "This is a note"
event.calendar = eventStore.defaultCalendarForNewEvents
eventStore.saveEvent(event, span: EKSpan.ThisEvent, error: nil)
print("Saved Event")
}
})
jedoch nach wie vor den folgenden Fehler bei t ich er unten in Bezug auf "EKSpan.ThisEvent": Falsche Argumentbezeichnung im Aufruf (habe ': span: error:', erwartet ': span: commit:').
Ich habe versucht, "Fehler" in "commit" zu ändern, aber es gab mir einen Compilerfehler, der sagte, dass es ein Bool statt Nil erwartet. Es scheint ein Problem zu sein, das mit Updates in schneller Syntax zu tun hat.
Edit: Ich endete nach this tutorial und war in der Lage, es zur Arbeit zu bekommen.
Fragen Sie zuerst die Berechtigung zum Zugriff auf den Kalender und (falls diese Berechtigung erteilt wurde) rufen Sie eine Funktion zum Hinzufügen des Ereignisses auf.
var savedEventId : String = "" func requestAccessPermission() { let eventStore = EKEventStore() let startDate = NSDate() let endDate = startDate.dateByAddingTimeInterval(60 * 60) // Ends one hour later if (EKEventStore.authorizationStatusForEntityType(.Event) != EKAuthorizationStatus.Authorized) { eventStore.requestAccessToEntityType(.Event, completion: { granted, error in self.createEvent(eventStore, title: "Test Title", startDate: startDate, endDate: endDate) }) } else { createEvent(eventStore, title: "Test Title", startDate: startDate, endDate: endDate) } }
Die Funktion, die in dem obigen Codeausschnitt genannt wird, um das Ereignis hinzuzufügen:
func createEvent(eventStore: EKEventStore, title: String, startDate: NSDate, endDate: NSDate) { let event = EKEvent(eventStore: eventStore) event.title = title event.startDate = startDate event.endDate = endDate event.calendar = eventStore.defaultCalendarForNewEvents do { try eventStore.saveEvent(event, span: .ThisEvent) savedEventId = event.eventIdentifier } catch { print("Error Saving") } }
Swift 3.0 kompatibel:
func addEventToCalendar(title: String, description: String?, startDate: Date, endDate: Date, completion: ((_ success: Bool, _ error: NSError?) -> Void)? = nil) {
let eventStore = EKEventStore()
eventStore.requestAccess(to: .event, completion: { (granted, error) in
if (granted) && (error == nil) {
let event = EKEvent(eventStore: eventStore)
event.title = title
event.startDate = startDate
event.endDate = endDate
event.notes = description
event.calendar = eventStore.defaultCalendarForNewEvents
do {
try eventStore.save(event, span: .thisEvent)
} catch let e as NSError {
completion?(false, e)
return
}
completion?(true, nil)
} else {
completion?(false, error as NSError?)
}
})
}
Und auch EventKit
importieren
Sie können diese Methode leicht rufen von überall her:
addEventToCalendar(title: "Girlfriend birthday", description: "Remember or die!", startDate: NSDate(), endDate: NSDate())
Wenn Sie es vorziehen, können Sie diese Methode in einer utiliy Klasse setzen und definieren es als ‚statisch‘.
Nizza, sauber, funktionierende Antwort –
Sie müssen hinzufügen" Datenschutz - Kalender Verwendung Beschreibung "in info.plist. –
Sie müssen "Privacy - Calendars Usage Description" zu info.plist hinzufügen. folgenden Code arbeitet mit der neuesten Version von Xcode und schnell 3.
import EventKit
class EventHelper
{
let appleEventStore = EKEventStore()
var calendars: [EKCalendar]?
func generateEvent() {
let status = EKEventStore.authorizationStatus(for: EKEntityType.event)
switch (status)
{
case EKAuthorizationStatus.notDetermined:
// This happens on first-run
requestAccessToCalendar()
case EKAuthorizationStatus.authorized:
// User has access
print("User has access to calendar")
self.addAppleEvents()
case EKAuthorizationStatus.restricted, EKAuthorizationStatus.denied:
// We need to help them give us permission
noPermission()
}
}
func noPermission()
{
print("User has to change settings...goto settings to view access")
}
func requestAccessToCalendar() {
appleEventStore.requestAccess(to: .event, completion: { (granted, error) in
if (granted) && (error == nil) {
DispatchQueue.main.async {
print("User has access to calendar")
self.addAppleEvents()
}
} else {
DispatchQueue.main.async{
self.noPermission()
}
}
})
}
func addAppleEvents()
{
let event:EKEvent = EKEvent(eventStore: appleEventStore)
event.title = "Test Event"
event.startDate = NSDate() as Date
event.endDate = NSDate() as Date
event.notes = "This is a note"
event.calendar = appleEventStore.defaultCalendarForNewEvents
do {
try appleEventStore.save(event, span: .thisEvent)
print("events added with dates:")
} catch let e as NSError {
print(e.description)
return
}
print("Saved Event")
}
}
Das auf iOS 11.2 Xcode wirklich langsam war 9.2, so dass ich modifizierte Antwort Luca Davanzo die Warteschlangen zu verwenden (viel schneller funktioniert):
func addEventToCalendar(title: String, description: String?, startDate: Date, endDate: Date, completion: ((_ success: Bool, _ error: NSError?) -> Void)? = nil) {
DispatchQueue.global(qos: .background).async {() -> Void in
let eventStore = EKEventStore()
eventStore.requestAccess(to: .event, completion: { (granted, error) in
if (granted) && (error == nil) {
let event = EKEvent(eventStore: eventStore)
event.title = title
event.startDate = startDate
event.endDate = endDate
event.notes = description
event.calendar = eventStore.defaultCalendarForNewEvents
do {
try eventStore.save(event, span: .thisEvent)
} catch let e as NSError {
completion?(false, e)
return
}
completion?(true, nil)
} else {
completion?(false, error as NSError?)
}
})
}
}
Swift 2.0 Implementierung hinzugefügt: [HIER ON LINK] (http: // stackoverflow.com/Fragen/246249/programmatisch-Add-custom-event-in-the-iPhone-Kalender/34790334 # 34790334) – Dashrath