DesmissViewControllerAnimated EXC_Bad_ACCESS en true

Seguí el tutorial "Un vistazo dentro de los controlleres de vista" publicado por Apple en WWDC para crear controlleres de vista personalizados (video aquí: https://developer.apple.com/videos/wwdc/2014/ y el código de muestra aquí: https: / /developer.apple.com/library/ios/samplecode/LookInside/Introduction/Intro.html ). He estado copyndo sobre todo su objective-C y traduciéndolo a Swift línea por línea y casi lo tengo funcionando a exception de ocultar el overlay viewController con un toque de gesto.

Cuando llamo:

func dimmingViewTapped(recognizer: UIGestureRecognizer) { self.presentingViewController.dismissViewControllerAnimated(true, completion: nil) } 

Recibo un error: Subprocess 1: EXC_BAD_ACCESS (código = 1, dirección = 0xc) si el campo animado está establecido en verdadero. Si está configurado en falso, todo funciona perfectamente y desaparece sin animation). Otra cosa extraña es que a veces funcionará cuando se establece en verdadero. Quizás una vez de cada 15 bashs se completará la animation y no obtendré un error.

Estoy siguiendo exactamente la misma estructura que se define en el código de ejemplo con un delegado de transición que maneja la creación del object del controller de presentación, así como las animaciones.

 class OverlayTransitioningDelegate : NSObject, UIViewControllerTransitioningDelegate { func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController, sourceViewController source: UIViewController) -> UIPresentationController { return OverlayPresentationController(presentedViewController: presented, presentingViewController: presenting) } func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? { var animationController: OverlayAnimatedTransitioning = OverlayAnimatedTransitioning() animationController.isPresentation = true return animationController } func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { var animationController: OverlayAnimatedTransitioning = OverlayAnimatedTransitioning() animationController.isPresentation = false return animationController } } 

Sé que ha habido algunas preguntas con respecto a esto, pero después de leerlas todavía estoy perplejo y estoy buscando ayuda.

Asegúrese de que su delegado en transición se lleve a cabo con fuerza. Establecer como una propiedad fuerte en su controller.

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; SearchDetailsViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"SearchStoryboardID"]; viewController.delegate = self; SearchDetailsViewControllerTransitioningDelegate *transitioningDelegate = [[SearchDetailsViewControllerTransitioningDelegate alloc] init]; **self.detailsTransitioningDelegate** = transitioningDelegate; viewController.transitioningDelegate = (id <UIViewControllerTransitioningDelegate>)self.detailsTransitioningDelegate; [self presentViewController:viewController animated:YES completion:nil]; 

Esto es en lugar de comentario. Pero no debería haber diferencia entre Swift y Objective-C. TransitioningDelegate debería ser débil en ambos casos.