Jawaban:
Berdasarkan Dokumentasi Apple , ini telah sedikit berubah pada iOS 6.0.
1) Anda harus meminta akses ke kalender pengguna melalui "requestAccessToEntityType: completion:" dan jalankan penanganan acara di dalam blok.
2) Anda perlu mengkomit acara Anda sekarang atau meneruskan param "komit" ke save / remove call Anda
Segala sesuatu yang lain tetap sama ...
Tambahkan kerangka EventKit dan #import <EventKit/EventKit.h>
ke kode Anda.
Dalam contoh saya, saya memiliki properti instance NSString * SavedEventId.
Untuk menambahkan acara:
EKEventStore *store = [EKEventStore new];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (!granted) { return; }
EKEvent *event = [EKEvent eventWithEventStore:store];
event.title = @"Event Title";
event.startDate = [NSDate date]; //today
event.endDate = [event.startDate dateByAddingTimeInterval:60*60]; //set 1 hour meeting
event.calendar = [store defaultCalendarForNewEvents];
NSError *err = nil;
[store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
self.savedEventId = event.eventIdentifier; //save the event id if you want to access this later
}];
Hapus acara:
EKEventStore* store = [EKEventStore new];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (!granted) { return; }
EKEvent* eventToRemove = [store eventWithIdentifier:self.savedEventId];
if (eventToRemove) {
NSError* error = nil;
[store removeEvent:eventToRemove span:EKSpanThisEvent commit:YES error:&error];
}
}];
Ini menambahkan acara ke kalender default Anda, jika Anda memiliki beberapa kalender maka Anda akan mengetahui yang mana
Versi cepat
Anda perlu mengimpor kerangka kerja EventKit
import EventKit
Tambahkan acara
let store = EKEventStore()
store.requestAccessToEntityType(.Event) {(granted, error) in
if !granted { return }
var event = EKEvent(eventStore: store)
event.title = "Event Title"
event.startDate = NSDate() //today
event.endDate = event.startDate.dateByAddingTimeInterval(60*60) //1 hour long meeting
event.calendar = store.defaultCalendarForNewEvents
do {
try store.saveEvent(event, span: .ThisEvent, commit: true)
self.savedEventId = event.eventIdentifier //save event id to access this particular event later
} catch {
// Display error to user
}
}
Hapus acara
let store = EKEventStore()
store.requestAccessToEntityType(EKEntityTypeEvent) {(granted, error) in
if !granted { return }
let eventToRemove = store.eventWithIdentifier(self.savedEventId)
if eventToRemove != nil {
do {
try store.removeEvent(eventToRemove, span: .ThisEvent, commit: true)
} catch {
// Display error to user
}
}
}
Anda bisa melakukan ini menggunakan kerangka Event Kit di OS 4.0.
Klik kanan pada grup FrameWorks di Groups and Files Navigator di sebelah kiri jendela. Pilih 'Tambah' lalu 'FrameWorks Yang Ada' lalu 'EventKit.Framework'.
Maka Anda harus dapat menambahkan acara dengan kode seperti ini:
#import "EventTestViewController.h"
#import <EventKit/EventKit.h>
@implementation EventTestViewController
- (void)viewDidLoad {
[super viewDidLoad];
EKEventStore *eventStore = [[EKEventStore alloc] init];
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
event.title = @"EVENT TITLE";
event.startDate = [[NSDate alloc] init];
event.endDate = [[NSDate alloc] initWithTimeInterval:600 sinceDate:event.startDate];
[event setCalendar:[eventStore defaultCalendarForNewEvents]];
NSError *err;
[eventStore saveEvent:event span:EKSpanThisEvent error:&err];
}
@end
Ya masih belum ada API untuk ini (2.1). Tapi sepertinya di WWDC banyak orang sudah tertarik dengan fungsionalitas (termasuk saya) dan rekomendasinya adalah pergi ke situs di bawah ini dan membuat permintaan fitur untuk ini. Jika ada cukup minat, mereka mungkin akhirnya memindahkan ICal.frework ke SDK publik.
Akses kalender sedang ditambahkan di iPhone OS 4.0 :
Aplikasi Akses Kalender kini dapat membuat dan mengedit acara langsung di aplikasi Kalender dengan Kit Peristiwa.
Buat acara berulang, atur waktu mulai dan akhir dan tetapkan untuk kalender apa pun di perangkat.
Anda dapat menambahkan acara menggunakan API Acara seperti yang diuraikan Tristan dan Anda juga dapat menambahkan acara Kalender Google yang muncul di kalender iOS.
menggunakan Google API Objective-C Client Google
- (void)addAnEvent {
// Make a new event, and show it to the user to edit
GTLCalendarEvent *newEvent = [GTLCalendarEvent object];
newEvent.summary = @"Sample Added Event";
newEvent.descriptionProperty = @"Description of sample added event";
// We'll set the start time to now, and the end time to an hour from now,
// with a reminder 10 minutes before
NSDate *anHourFromNow = [NSDate dateWithTimeIntervalSinceNow:60*60];
GTLDateTime *startDateTime = [GTLDateTime dateTimeWithDate:[NSDate date]
timeZone:[NSTimeZone systemTimeZone]];
GTLDateTime *endDateTime = [GTLDateTime dateTimeWithDate:anHourFromNow
timeZone:[NSTimeZone systemTimeZone]];
newEvent.start = [GTLCalendarEventDateTime object];
newEvent.start.dateTime = startDateTime;
newEvent.end = [GTLCalendarEventDateTime object];
newEvent.end.dateTime = endDateTime;
GTLCalendarEventReminder *reminder = [GTLCalendarEventReminder object];
reminder.minutes = [NSNumber numberWithInteger:10];
reminder.method = @"email";
newEvent.reminders = [GTLCalendarEventReminders object];
newEvent.reminders.overrides = [NSArray arrayWithObject:reminder];
newEvent.reminders.useDefault = [NSNumber numberWithBool:NO];
// Display the event edit dialog
EditEventWindowController *controller = [[[EditEventWindowController alloc] init] autorelease];
[controller runModalForWindow:[self window]
event:newEvent
completionHandler:^(NSInteger returnCode, GTLCalendarEvent *event) {
// Callback
if (returnCode == NSOKButton) {
[self addEvent:event];
}
}];
}
Implementasi Swift 4.0:
gunakan impor di bagian atas halaman oleh import EventKit
kemudian
@IBAction func addtoCalendarClicked(sender: AnyObject) {
let eventStore = EKEventStore()
eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in
if (granted) && (error == nil) {
print("granted \(granted)")
print("error \(error)")
let event = EKEvent(eventStore: eventStore)
event.title = "Event Title"
event.startDate = Date()
event.endDate = Date()
event.notes = "Event Details Here"
event.calendar = eventStore.defaultCalendarForNewEvents
var event_id = ""
do {
try eventStore.save(event, span: .thisEvent)
event_id = event.eventIdentifier
}
catch let error as NSError {
print("json error: \(error.localizedDescription)")
}
if(event_id != ""){
print("event added !")
}
}
})
}
Perbarui untuk swift 4 untuk jawaban Dashrath
import UIKit
import EventKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let eventStore = EKEventStore()
eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in
if (granted) && (error == nil) {
let event = EKEvent(eventStore: eventStore)
event.title = "My Event"
event.startDate = Date(timeIntervalSinceNow: TimeInterval())
event.endDate = Date(timeIntervalSinceNow: TimeInterval())
event.notes = "Yeah!!!"
event.calendar = eventStore.defaultCalendarForNewEvents
var event_id = ""
do{
try eventStore.save(event, span: .thisEvent)
event_id = event.eventIdentifier
}
catch let error as NSError {
print("json error: \(error.localizedDescription)")
}
if(event_id != ""){
print("event added !")
}
}
})
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Kode kerja di Swift-4.2
import UIKit
import EventKit
import EventKitUI
class yourViewController: UIViewController{
let eventStore = EKEventStore()
func addEventToCalendar() {
eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in
DispatchQueue.main.async {
if (granted) && (error == nil) {
let event = EKEvent(eventStore: self.eventStore)
event.title = self.headerDescription
event.startDate = self.parse(self.requestDetails.value(forKey: "session_time") as? String ?? "")
event.endDate = self.parse(self.requestDetails.value(forKey: "session_end_time") as? String ?? "")
let eventController = EKEventEditViewController()
eventController.event = event
eventController.eventStore = self.eventStore
eventController.editViewDelegate = self
self.present(eventController, animated: true, completion: nil)
}
}
})
}
}
Sekarang kita akan mendapatkan layar acara dan di sini Anda juga dapat mengubah pengaturan Anda:
Sekarang tambahkan metode delegasi untuk menangani Batal dan menambahkan aksi tombol layar acara acara:
extension viewController: EKEventEditViewDelegate {
func eventEditViewController(_ controller: EKEventEditViewController, didCompleteWith action: EKEventEditViewAction) {
controller.dismiss(animated: true, completion: nil)
}
}
Catatan: Jangan lupa menambahkan kunci NSCalendarsUsageDescription ke info plist.
Ingatlah untuk mengatur endDate ke acara yang dibuat, itu wajib.
Kalau tidak, ia akan gagal (hampir tanpa suara) dengan kesalahan ini:
"Error Domain=EKErrorDomain Code=3 "No end date has been set." UserInfo={NSLocalizedDescription=No end date has been set.}"
Kode kerja lengkap untuk saya adalah:
EKEventStore *store = [EKEventStore new];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (!granted) { return; }
EKEvent *calendarEvent = [EKEvent eventWithEventStore:store];
calendarEvent.title = [NSString stringWithFormat:@"CEmprendedor: %@", _event.name];
calendarEvent.startDate = _event.date;
// 5 hours of duration, we must add the duration of the event to the API
NSDate *endDate = [_event.date dateByAddingTimeInterval:60*60*5];
calendarEvent.endDate = endDate;
calendarEvent.calendar = [store defaultCalendarForNewEvents];
NSError *err = nil;
[store saveEvent:calendarEvent span:EKSpanThisEvent commit:YES error:&err];
self.savedEventId = calendarEvent.eventIdentifier; //saving the calendar event id to possibly deleted them
}];
Gagasan Google bagus, tetapi memiliki masalah.
Saya dapat berhasil membuka layar acara kalender Google - tetapi hanya pada versi desktop utama, dan itu tidak ditampilkan dengan benar di iPhone Safari. Kalender seluler Google, yang ditampilkan dengan benar di Safari, tampaknya tidak berfungsi dengan API untuk menambah acara.
Untuk saat ini, saya tidak bisa melihat jalan keluar yang bagus untuk ini.
Sederhana .... gunakan perpustakaan tapku .... Anda dapat google kata itu dan menggunakannya ... open source ... nikmati ..... tidak perlu mengganggu dengan kode-kode itu ....