La diferencia entre pushViewController y presentViewController
1.presentModalViewController y presentViewController
Primero, hablemos de la diferencia entre presentModalViewController y presentViewController: desde iOS6, presentModalViewController y presentViewController son iguales. presentModalViewController ha quedado obsoleto en favor de presentViewController.
2. presentViewController y pushViewController
Ahora, hablemos de la diferencia entre presentViewController y pushViewController. Primero, el código fuente para llamarlos es:
[self.navigationController pushViewController:(nonnull UIViewController *) animados:(BOOL)] // Llamar a pushViewController
[self presentViewController: ( UIViewController no nulo *) animado: (BOOL) finalización: ^ (void) finalización]; // Llama a pushViewController
Como puedes ver en el código fuente, pushViewController actúa sobre NavigationController. Es decir, si desea utilizar pushViewController para saltar a la interfaz, debe asegurarse de que la página actual tenga un NavigationController. En cuanto a presentViewController, no tiene tal limitación y se puede usar cuando la página actual no tiene una barra de navegación.
Además, pushViewController insertará una vista en la pila y la mostrará, lo que facilita encontrar la vista anterior y volver a cualquier vista anterior. Mientras que presentViewController mostrará una vista directamente, por lo que solo podrá volver a la vista anterior cada vez.
Entre navegaciones que han estado usando pushViewController, una vez que se usa presentViewController, el NavigationController de la interfaz actual quedará vacío y pushViewController no podrá usarlo. Si desea volver a utilizar pushViewController, debe restablecer NavigationController. Sin embargo, en este caso la vista actual se convertirá en rootViewController y no se encontrará la vista anterior en la cadena de navegación.
PushViewController y presentViewController devuelven el método de vista anterior:
[self.navigationController popToViewController:(nonnull UIViewController *) animados:(BOOL)];//pushViewController devuelve
[self dismissViewControllerAnimated:(BOOL) finalización:^(void) finalización];//presentViewController devuelve