present modally modal ios swift uiviewcontroller modal-dialog

ios - modally - ¿Cómo presentar modalmente un ViewController, y luego ejecutar una función/bloque de devolución de llamada una vez que se ha descartado ViewController, sin Delegate?



swift present modally programmatically (4)

Solo sabía que el bloque de finalización en self.presentViewController(childVc, animated: true, completion: {}) se llama después de que el controlador de vista secundaria termine de animarse para mostrarse en la pantalla. De hecho, quiero ejecutar un bloque de código que se muestra después de que la animación del controlador de vista secundaria termina de recibir animación para ser descartada . ¿Cómo puedo hacer eso, prefiero evitar el uso de delegado para hacer eso?

EDITAR: Llamo esto desde el controlador de vista presentado (hijo) de esta manera: self.presentingViewController.dismissViewControllerAnimated (true) {} , pero el problema es que el controlador de vista secundaria se puede presentar desde una página arbitraria, y después de que se descarta el elemento secundario, el controlador de vista padre (presentador) tiene que hacer cosas diferentes. Si implemento la devolución de llamada en el niño, no puedo hacer algo diferente con el padre diferente que lo llame.

Por ejemplo, si llamo al formulario de inicio de sesión como modal en la pantalla de noticias, después de que se desestime el formulario de inicio de sesión, deseo mostrar la sección de comentarios después. Pero si el formulario de inicio de sesión se muestra de manera modal desde la pantalla del producto, quiero mostrar el carro del usuario con el producto en el carrito luego. Si esto es imposible de hacer sin delegado, aún me interesa la solución de delegado.


Puede agregar una propiedad a su ChildVC para almacenar un cierre de devolución de llamada y configurar esto cuando presente el controlador de vista infantil. Cuando el controlador de vista hijo se cierra solo puede llamar al controlador de finalización:

class ChildVC: UIViewController { var completionHandler : ((childVC:ChildVC) -> Void)? func dismiss() { self.dismissViewControllerAnimated(true) { self.completionHandler?(childVC:self) } } }

Proporciona el controlador de finalización cuando presenta la instancia de ChildVC:

let completionHandler:(ChildVC)->Void = { childVC in print("completed for /(childVC)") } childVC.completionHandler=completionHandler self.presentViewController(childVC, animated: true, completion: nil)


Puede crear un bloque de devolución de llamada en ViewController presentado como ese @property(nonatomic,copy)void (^onDimissed)();
y después en la llamada de controlador de vista presentada
[self dismissViewControllerAnimated:YES completion:^{ if (self.onDismissed) { self.onDismissed(); } }];
Entonces puedes devolver cualquier parámetro en bloque
Y no olvides hacer esto
SomeController *ctr = [[UIViewController alloc] init]; ctr.onDimissed = ^{ //some your implementation };


Si usa self.presentingViewController.dismissViewControllerAnimated (true) {} esto devuelve nil por qué significa que no es compatible con todo el sistema operativo, así que simplemente use este código a continuación,

self.dismissViewControllerAnimated(true, completion: { //Put your code });

si descarta ViewController puede llamar a cualquier función y colocar su código en el controlador de finalización.

espero que sea útil


Utilice dismissViewControllerAnimated API que toma un bloque de finalización.

self.dismissViewControllerAnimated(true) { /* Do callback stuff here*/ }