2008-10-29 14 views

Respuesta

155

Basado en Apple Documentation, esto ha cambiado un poco desde iOS 6.0.

1) Debe solicitar acceso al calendario del usuario a través de "requestAccessToEntityType: completion:" y ejecutar el manejo de eventos dentro de un bloque.

2) que necesita confirmar su evento ahora o pasar la "comprometerse" parámetro a la llamada guardar/eliminar

Todo lo demás se mantiene igual ...

Añadir el marco EventKit y #import <EventKit/EventKit.h> a su código.

En mi ejemplo, tengo una propiedad de instancia NSString * savedEventId.

Para agregar un evento:

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 
    }]; 

eliminar el evento:

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]; 
     } 
    }]; 

Esto añade eventos a su calendario predeterminado, si tiene varios calendarios entonces usted tendrá que averiguar cuál de que es

versión Swift

Es necesario importar el marco EventKit

import EventKit 

Añadir evento

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 
    } 
} 

caso Quitar

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 
     } 
    } 
} 
+5

no funciona para mí, todo va sin errores pero no hay evento en el calendario –

+0

Todo se almacena en el objeto ekevent pero no se almacena dentro del calendario hlp mí –

+1

@William T: ¿Puedo presentar la pantalla Agregar evento de la aplicación Calendario (usando el esquema URL) y pasar la información del evento para que cuando aparezca la pantalla Agregar evento, tenga datos previamente rellenos. El usuario solo necesita presionar el botón Agregar evento. En su ejemplo de evento agregado sin ninguna indicación al usuario. – Ans

13

Sí, todavía no hay API para esto (2.1). Pero parecía que en la WWDC mucha gente ya estaba interesada en la funcionalidad (incluyéndome a mí) y la recomendación era ir al siguiente sitio y crear una solicitud de función para esto. Si hay suficiente interés, podrían terminar moviendo el ICal.framework al SDK público.

https://developer.apple.com/bugreporter/

+5

respuesta está desactualizada, considere eliminar este – Jasper

0

La idea de Google es un bonito, pero tiene problemas.

Puedo abrir con éxito una pantalla de evento de calendario de Google, pero solo en la versión de escritorio principal, y no se muestra correctamente en iPhone Safari. El calendario móvil de Google, que se muestra correctamente en Safari, no parece funcionar con la API para agregar eventos.

Por el momento, no veo una buena salida para este.

11

Calendar access is being added in iPhone OS 4.0:

Calendar Access
Apps can now create and edit events directly in the Calendar app with Event Kit.
Create recurring events, set up start and end times and assign them to any calendar on the device.

+1

su enlace está roto ahora. –

154

Usted puede hacer esto utilizando el Kit de eventos en OS 4.0.

Haga clic derecho en el grupo FrameWorks en el Navegador de Grupos y Archivos a la izquierda de la ventana. Seleccione 'Agregar', luego 'Matriz de marcos existente' y luego 'Matriz de eventos. Armazón'.

Entonces usted debe ser capaz de añadir eventos con código como este:

#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 
+18

Gracias por publicar esto. Solo un recordatorio para todos los que lean esto: tengan cuidado de ver si hay pérdidas de memoria. Hay un par en este ejemplo de código. Además, las mejores prácticas dictarían que verifique el valor de 'err' después de saveEvent: span: error y que maneje las cosas como corresponda. –

+0

¿Sabes cómo agregar el evento recurrencia? como un evento para cada lunes? –

+5

Agregue el evento de recurrencia mediante programación: revise esto http://developer.apple.com/library/ios/#documentation/EventKit/Reference/EKRecurrenceRuleClassRef/Reference/Reference.html#//apple_ref/doc/c_ref/EKRecurrenceRule. Otra opción es usar los controladores de vista provistos por el marco por defecto para agregar/editar eventos (como la aplicación de vista previa de calendario http://bit.ly/cJq4Bh). Para obtener esta opción, consulte http://developer.apple.com/library/ios/#documentation/EventKitUI/Reference/EKEventEditViewControllerClassRef/Reference/Reference.html – DenTheMan

5

Puede añadir el evento mediante la API de eventos como Tristán esbozó y también se puede añadir un evento de Google Calendar que se muestra en el calendario de iOS.

usando Google's API Objective-C Client

- (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]; 
       } 
       }]; 
} 
1

simple .... utilización tapku biblioteca .... usted puede buscar en Google la palabra y utilizarla ... su fuente abierta ... disfrutar ..... hay necesidad de molestar con esos códigos ...

+3

https://developer.apple.com/library/ios/# documentation/DataManagement/Conceptual/EventKitProgGuide/Introduction/Introduction.html # // apple_ref/doc/uid/TP40009765 –

+0

Calendario de la biblioteca Can Tapku sincronizar con eventos de la aplicación de calendario – coder1010

+0

Todo lo que sé es que la biblioteca Tapku es una control de componente de calendario que tiene una opción llamada Fuente de datos. Por lo tanto, es lógico escribir la fuente de donde está obteniendo ... Happy Coding :) –

3

Swift 4.0 aplicación:

uso de importaciones en la parte superior de la página por import EventKit

continuación

@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 !") 
      } 
     } 
    }) 
} 
+0

podría ayudarme con el calendario de google con la misma respuesta @ Dashrath –

1

Recuerde que debe establecer la endDate al evento creado, es obligatorio.

De lo contrario, se producirá un error (casi en silencio) con este error:

"Error Domain=EKErrorDomain Code=3 "No end date has been set." UserInfo={NSLocalizedDescription=No end date has been set.}" 

El código completo de trabajo para mí es:

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 
}]; 
+1

Y también recuerde que la fecha de finalización debe ser igual o mayor que la fecha de inicio. De lo contrario, obtendrá otro error. – moody

1

actualización para SWIFT 4 para la respuesta 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. 
    } 


} 

también no se olvide de agregar el permiso para el uso del calendario image for privary setting

Cuestiones relacionadas