Cómo quitar un ViewController anterior

Soy un estudiante y muy nuevo en la progtwigción. Estoy intentando aprender Objective-C / Swift en mi time libre. Hice un juego usando spriteKit con Swift que tiene múltiples menus / escenas.

Estoy tratando de hacer la transición de un controller de vista a otro. Para hacer esto, usé este código:

@IBAction func PlayButtonPressed(sender: AnyObject) { let playStoryboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let vc : UIViewController = playStoryboard.instantiateViewControllerWithIdentifier("playGame") as UIViewController self.presentViewController(vc, animated: true, completion: nil) } 

Esto funciona para la transición a la nueva escena de VC, sin embargo, creo que el VC anterior todavía está en la stack y ocupa memory, lo que ralentiza mi progtwig.

Leí en otras publicaciones que puedes usar el controller de navigation para eliminar VC. Sin embargo, no tengo un controller de navigation; solo ver controlleres. He visto algunas cosas sobre removeFromParentViewController() y view.removeFromSuperview() , pero realmente no sé cómo implementarlo. Aparte de eso, no encontré una respuesta que estaba buscando.

Entonces, la pregunta que estoy haciendo es ¿cómo elimino el VC anterior de la stack? ¡Cualquier ayuda sería apreciada! (preferiría que la ayuda sea rápida, pero Objective-C también ayudaría) ¡Gracias de antemano!

nota para reference: creo en Objective-C mi código se vería así:

 -(IBAction) PlayButtonPressed: (id) sender { UIStoryboard *playStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController *vc = [playStoryboard instantiateViewControllerWithIdentifier:@"playGame"]; [self presentViewController:vc animated:YES completion:nil]; } 

Como puedo suponer, el controller de vista que se presenta en la pantalla se instanció automáticamente desde el guión gráfico principal o estableciendo la propiedad window.rootViewController la aplicación.

En cualquier caso, puedes volver a configurar rootViewController para que sea tu vc . Para cambiar rootViewController de su aplicación, debe replace esta línea de código:

 self.presentViewController(vc, animated: true, completion: nil) 

… con una de las opciones a continuación.

"Navegar" sin animation de transición:

C objective

 UIWindow *window = (UIWindow *)[[UIApplication shanetworkingApplication].windows firstObject]; window.rootViewController = vc; 

Rápido

 let window = UIApplication.shanetworkingApplication().windows[0] as UIWindow; window.rootViewController = vc; 

"Navegar" con animation de transición:

C objective

 UIWindow *window = (UIWindow *)[[UIApplication shanetworkingApplication].windows firstObject]; [UIView transitionFromView:window.rootViewController.view toView:vc.view duration:0.65f options:UIViewAnimationOptionTransitionCrossDissolve // transition animation completion:^(BOOL finished){ window.rootViewController = vc; }]; 

Rápido

 let window = UIApplication.shanetworkingApplication().windows[0] as UIWindow; UIView.transitionFromView( window.rootViewController.view, toView: vc.view, duration: 0.65, options: .TransitionCrossDissolve, completion: { finished in window.rootViewController = vc }) 

Comentarios: Una vez que se modifica el valor de rootViewController, el recuento de reference del controller de vista original debería ser 0, ¡por lo tanto, se eliminará de la memory!

Creo que la mejor implementación es colocar lo siguiente en el controller de vista anterior: Swift

  // Override to remove this view from the navigation stack override func viewDidDisappear(animated: Bool) { super.viewDidDisappear(animated) // Remove self from navigation hierarchy guard let viewControllers = navigationController?.viewControllers, let index = viewControllers.indexOf(self) else { return } navigationController?.viewControllers.removeAtIndex(index) } 

En primer lugar, está utilizando el patrón de presentación modal, en lugar de un patrón de stack de navigation ( UINavigationController ). No puede deshacerse del controller de vista de presentación ni debería hacerlo, ya que interrumpiría la navigation.

La respuesta corta aquí es que no necesitas preocuparte por esto. La cantidad de memory que un controller de visualización ocupa es trivial y se liberará automáticamente una vez que no haya más references a la misma (una la descarta o la desplaza de una stack de navigation).

La respuesta más larga dependerá de su implementación específica. Si de alguna manera estás en una situación en la que incrementas infinitamente el tamaño de una stack, entonces es un problema. Un ejemplo sería si tiene un flujo de navigation donde puede moverse libremente entre dos "pantallas", pero internamente cada pantalla sigue presentando una nueva en lugar de simplemente cambiar a una existente. Si está experimentando algo como esto, entonces sería más adecuado utilizar un UITabBarController o algo similar, donde puede navegar lateralmente entre los controlleres de vista sin crear otros nuevos.

Para swift 3 puede replace

 self.present(ViewController(), animated: false, completion: nil); 

con

 if let window = UIApplication.shanetworking.keyWindow{ window.rootViewController = UINavigationController(rootViewController: ViewController()); }