Detener el controller de navigation que afecte a otros controlleres de vista.

Tengo una aplicación que utiliza un controller de navigation con tres controlleres de vista para la configuration del usuario paso a paso. Entonces, la primera vista sería el Paso 1, el Segundo Paso 2, etc. Y todo esto estaría embedded en un controller de navigation para que el usuario pueda ir y venir. Sin embargo, una vez que se realiza esta configuration y el usuario presiona el button 'Listo', la aplicación se mueve programáticamente a otra sección del storyboard que se supone que es independiente de la configuration inicial. Seguido programáticamente a esta sección con el siguiente código:

let vc : AnyObject! = self.storyboard!.instantiateViewControllerWithIdentifier("welcomeViewController") self.showViewController(vc as! UIViewController, sender: vc) 

donde "welcomeViewController" es el identificador para el ViewController posterior a la installation. Sin embargo, una vez que esto sucede, la Barra de control de navigation sigue apareciendo en la parte superior y puedes volver a navegar al menu de configuration, que no es lo que quiero. Esto es lo que quiero decir:

introduzca la descripción de la imagen aquí

El usuario no debería poder acceder a la configuration inicial después de haber configurado. Mi storyboard se ve así:

introduzca la descripción de la imagen aquí

Los cuatro cuadros a la izquierda son para la configuration. Los tres cuadros de la derecha es el 'Menú principal' que quiero crear.

Como puede ver, no hay flecha entre el último Controlador de configuration y el Controlador de barra de tabs porque ejecuté ese segue mediante progtwigción (como se muestra arriba). ¿Cómo hago para que el controller de navigation deje de afectar el rest de mis controlleres de vista?

Esto sucede porque una segue bajo el capó hace uso del UINavigationController actual, por lo que no importa si realiza el segue programáticamente o en los storyboards directamente.

Hay varias maneras de cómo abordar esto. Una forma muy fácil de lograrlo es simplemente ocultar el button Atrás en su WelcomeViewController usando self.navigationItem.hidesBackButton = YES; .

Sin embargo, esto realmente no resuelve su problema si realmente desea una separación entre estos controlleres de vista y desea deshacerse del UINavigationController responsable de su process de configuration. Lo que realmente recomendaría para ese tipo de situación es utilizar dos storyboards diferentes , uno para su configuration inicial y otro para la parte principal. Luego, cambia el UIWindow de rootViewController a un controller de vista desde el otro storyboard mediante progtwigción. Esto se puede hacer en pocas líneas de código y ayuda a separar sus preocupaciones y mantener una visión general mejor del flujo de su aplicación.

Déjame saber en los comentarios si necesitas más explicación 🙂

El cambio de storyboards se puede lograr usando el siguiente código:

 UIStoryboard *main = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; UIViewController *welcomeViewController = [main instantiateViewControllerWithIdentifier:@"WelcomeViewController"]; UIWindow *mainApplicationWindow = [[[UIApplication shanetworkingApplication] delegate] window]; mainApplicationWindow.rootViewController = welcomeViewController; 

Pero si desea instanciar todo el UITabBarController que utiliza en su interfaz principal, tendrá que darle una ID (por ejemplo, MainTabBarController ) en storyboards para poder instanciarlo mediante instantiateViewControllerWithIdentifier: Entonces, en lugar de crear una instancia de WelcomeViewController , irás:

 UIStoryboard *main = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; UITabBarController *mainTabBarController = [main instantiateViewControllerWithIdentifier:@"MainTabBarController"]; UIWindow *mainApplicationWindow = [[[UIApplication shanetworkingApplication] delegate] window]; mainApplicationWindow.rootViewController = mainTabBarController; 

Una solución muy fácil es este problema, es hacer que una segue desde su último UIVieController que desea incrustarse en el UINavigationController a la que desea fuera del UINavigationController.

Paso 1. Ctrl arrastre desde el ícono amarillo en la parte superior del UIViewController (embedded en UINavigationController) al UIViewController al que desea acceder (fuera del UINavigationController), y select "Present Modally"

Paso 2. Regale un identificador en el guión gráfico

Paso 3. En su código, donde quiere hacer la segue, poner;

 performSegue(withIdentifier: "yourSegueID", sender: self) 

Esto hará el truco y hará que su storyboard sea más legible.