La animation personalizada de segue no se reproduce la primera vez que presiona el button

Encontré un comportamiento inusual en el que estoy atascado un poco, el problema es el siguiente.

Estoy usando la librería BWWalkthrough para tener 4 diapositivas como pantalla de inicio. Entonces, en mi appdelegate tengo el siguiente código que inicializa a los viewcontrollers:

let storyboard = UIStoryboard(name: "SlidesFlow", bundle: nil) let walkthrough = storyboard.instantiateViewController(withIdentifier: "SlidesView") as! BWWalkthroughViewController let page_zero = storyboard.instantiateViewController(withIdentifier: "page_1") let page_one = storyboard.instantiateViewController(withIdentifier: "page_2") let page_two = storyboard.instantiateViewController(withIdentifier: "page_3") let page_three = storyboard.instantiateViewController(withIdentifier: "page_4") walkthrough.delegate = self walkthrough.addViewController(page_zero) walkthrough.addViewController(page_one) walkthrough.addViewController(page_two) walkthrough.addViewController(page_three) 

Todo funciona según lo previsto, así que no hay problema aquí. En el viewController page_three tengo un button que me networkingirecciona a otro controller de vista usando una animation segue personalizada

 class sentSegueFromRight: UIStoryboardSegue { override func perform() { let src = self.source as UIViewController let dst = self.destination as UIViewController src.view.superview?.insertSubview(dst.view, aboveSubview: src.view) dst.view.transform = CGAffineTransform(translationX: src.view.frame.size.width, y: 0) UIView.animate(withDuration: 0.25, delay: 0.0, options: UIViewAnimationOptions.curveEaseInOut, animations: { dst.view.transform = CGAffineTransform(translationX: 0, y: 0) }, completion: { finished in src.present(dst, animated: false, completion: nil) } ) } } 

Ahora el problema es que si utilizo el mismo código en un controller de vista normal, el button y la animation funcionan sin problemas. El problema es cuando uso el segue definido anteriormente de la última diapositiva de mi BWWalkthrough. La primera vez que presiono el button aparece el controller de vista que debería aparecer, pero sin la animation correspondiente. Después de cerrarlo y volver a pulsar el button, se reproduce la animation pero se devuelve un error:

Se desaconseja la presentación de controlleres de vista en controlleres de vista desconectados.

Si utilizo el button con la animation estándar (sin usar mi código de animation personalizado) no recibo ningún error y se reproduce la animation pnetworkingeterminada.

No puedo encontrar una solución a este problema. ¿Alguien se topó con algo así?

El problema aquí reside en la biblioteca BWWalkthrough que está utilizando una vista de desplazamiento para presentar todas las vistas de los diversos ViewControllers que agregue.

Como tal, agrega la vista dst.view al comienzo de la vista de desplazamiento (en el ancho de pantalla de desplazamiento, 0) que luego transforma para desplazarse (0,0).

Todo esto está fuera de la pantalla, ya que actualmente se encuentra en la tercera pantalla del tutorial (en offset (screenwidth * 3,0)). Como tal, no puede ver la animation y ver directamente el controller de vista presentado cuando termina la segue.

Para remediar esto, agregue su vista de dst.view en la vista de supervisión de la vista de desplazamiento. es decir, en lugar de src.view.superview?.insertSubview(dst.view, aboveSubview: src.view) escribe src.view.superview?.superview?.insertSubview(dst.view, aboveSubview: src.view) en segue. (Suponiendo que está utilizando el segue solo desde el tutorial)

Si tiene la intención de usar segue en otros lugares también, quizás pueda agregar una verificación de tipo en el segue para comprobar si la vista de supervisión de src.view es una vista de desplazamiento; si es así, agregue dst.view a la vista superior de la vista de desplazamiento.