2011-01-21 51 views
5

No recibo una llamada a mi eventViewController: didCompleteWithAction: cuando el EKEventViewController termina editando un evento.EKEventViewDelegate didCompleteWithAction no se llama

Así es como lo configuro:


- (void)showCalendar:(id)sender { 
    EKEventViewController *eventViewController = [[EKEventViewController alloc] init]; 

    eventViewController.delegate = self; 

    eventViewController.event = self.event; 

    // Allow event editing. 
    eventViewController.allowsEditing = YES; 

    [self.navigationController pushViewController:eventViewController animated:YES]; 
    [eventViewController release]; 
} 

tengo el protocolo en mi clase y el método fue implementos Copia y pega la definición de los documentos. Simplemente no se llama.

Si utilizo EKEventEditViewController y su delegado correspondiente, se llama cuando se guarda el evento.

Pude reproducir el problema también en el código SimpleEKDemo. ¿Alguien sabe qué podría estar mal?

Podría simplemente dejar caer la funcionalidad de vista e ir directamente al EKEventEditViewController, pero preferiría no hacerlo.

+0

Estoy recibiendo el mismo comportamiento. Se llama al delegado cuando se elimina el evento, pero no cuando se edita. Estoy empujando el EKEventViewController en mi pila de controladores de navegación como un VC regular (es decir, no modalmente). ¿Cómo lo presentas? –

+0

Como se muestra en el código anterior. Lo estoy empujando a la pila. – Rob

Respuesta

1

en este archivo .m necesita importar el EventKit/EventKit.h y EventKitUI/EventKitUI.h y en el archivo .h que necesita para implementar los delegados 'EKEventViewDelegate'.

espero que le ayuda a

+0

Tenía esos.Sin embargo, me acabo de dar cuenta de que se llamó al delegado cuando acepté o rechacé una invitación a un evento. Simplemente no me llaman si edito un evento creado localmente dentro del EKEventViewController – Rob

4

podría ser un poco tarde para ser útil, pero tuve este problema también.

Para conseguir alrededor de él me subclases EKEventViewController, a continuación, en la subclase viewDidLoad He sustituido el botón estándar de edición con uno de mi propia:


- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UIBarButtonItem *editItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self.delegate action:@selector(editCalEvent)]; 

    self.navigationItem.rightBarButtonItem = editItem; 
} 


De esta forma cuando se desea editar una evento, puede configurar su propia EKEventEditViewController y especificar su delegado con el fin de responder a los cambios:


- (void)editCalEvent { 

    EKEventEditViewController *editController = [[EKEventEditViewController alloc] init]; 

    editController.event = editingEvent; 
    editController.eventStore = self.eventStore; 
    editController.editViewDelegate = self; 

    [self presentModalViewController:editController animated:YES]; 

    [editController release]; 

} 


Espero que ayude.

2

que tenían el mismo problema cuando uso "pushViewController", el resultado es que va a ir a

- (void)navigationController:(UINavigationController *)navigationController 
    willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{} 

Pero después de cambiar a presentModalViewController, irá a eventViewController:didCompleteWithAction: cuando se hace/Cancelar/Borrado presionado.

+0

Encontré un problema similar con el iPad. Inicialmente trató de colocar en un popover modal y no recibió devoluciones de llamada. Cambiado a usar presentModalViewController y todo está bien. – RunningPink

0

Esto parece ser una omisión bastante obvia en la biblioteca. Mi solución: estoy presentando el EKEventViewController en un UINavigationController. Detecto la finalización en el método viewWillAppear del controlador que empujé el EKEventViewController en la pila de la vista. Utilice una variable booleana en este controlador de vista para rastrear y diferenciar entre la apariencia inicial y la reaparición debido al evento EKEventViewController que se está sacando. Existe el riesgo de que su código sea llamado en otro momento, pero si solo está refrescando las tablas, etc., entonces esto debería ser suficiente.