2011-04-29 9 views
14

Tengo una aplicación que usa la plantilla de "aplicación basada en navegación" en XCode.Cómo reemplazar RootViewController en "Aplicación basada en navegación"

Ahora quiero cambiarlo para que la primera vista que cargue sea una UIView normal (personalizada), y si el usuario hace clic en un botón en particular, presiono RootViewController original en NavigationController.

entiendo que en algún lugar, alguien está llamando esto con mi RootViewController:

- (id)initWithRootViewController:(UIViewController *)rootViewController 

Quiero saber cómo sustituir la discusión con mi nueva clase.

Respuesta

23

si desea reemplazar la raíz compita w controlador de su pila de navegación puede reemplazar el primer objeto de su matriz de controladores de vista como -

NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]]; 

NewViewController *nvc = [[NewViewController alloc] init]; 
[viewControllers replaceObjectAtIndex:0 withObject:nvc]; 
[self.navigationController setViewControllers:viewControllers]; 
+0

Esta es una idea interesante. Me gusta más de lo que estoy haciendo ahora, pero mira mi comentario sobre la magia en la respuesta de ljkyser. – iter

+0

¿Alguna vez has probado esto? ¡No puede lanzar un NSArray con un NSMutableArray! Debe crear un NSMutableArray con [self.navigationController.viewControllers mutableCopy]. – DreamOfMirrors

2

observar el interior del archivo de aplicación principal delegado .m y encontrar el método

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

del mismo será una línea como esta

self.window.rootViewController = self.navigationController;

Puede crear instancias de un controlador de vista diffent allí y asígnelo para ser el control raízViewController

+0

Esto es lo que estoy haciendo. Me doy cuenta de que la acción 'didFinishLaunching' no crea una instancia de navigationController. Tengo curiosidad por saber quién hace y dónde y cómo puedo intercalar. Nominalmente, lo que trato de evitar es hacer el trabajo dos veces (es decir, crear instancias e inmediatamente descartar un controlador de navegación). Realmente, estoy tratando de entender la magia detrás de escena que es XIB. – iter

+2

En realidad, está almacenado en el archivo MainWindow.xib y se carga de forma perezosa, creo. Creo que podría cambiar el valor predeterminado que está utilizando a través del constructor de interfaz, pero no lo he hecho antes. Casi siempre hacemos todo desde código sin el constructor de interfaz, así que lo evitamos por completo. – ljkyser

+0

Sí, casi siempre hago todo de código, también. Este es un proyecto anterior: un legado de la curva de aprendizaje. – iter

5

^Todas estas son formas de hacerlo mediante programación. Eso es genial. Pero yo uso el constructor de interfaces y guiones gráficos en Xcode, así que esta es la manera fácil y rápida de agregar un nuevo controlador de vista:

  • Abrir el guión gráfico en cuestión
  • Añadir un nuevo controlador de vista a su guión gráfico arrastrando desde la lista de objetos (barra inferior derecha de la barra de herramientas)
  • Mientras mantiene presionada la tecla CONTROL, haga clic y arrastre desde el centro de su controlador de navegación (debe estar en blanco y gris) a su nueva vista en blanco.
  • En la ventana emergente, la selección Relación Segue: Raíz Vista Controlador (debería estar por debajo de las opciones de empuje/modal/personalizados normales es probable que haya visto antes)

Tada! Disfrute de su nuevo controlador de vista raíz sin tener que levantar el día con la creación de programas.

+0

El hecho de que prefiera la creación programática no significa que deba restar importancia a esta respuesta. Esto funciona bien. – woody121

+4

Pero el OP preguntaba por "Reemplazar" el RootViewController después de hacer clic en un botón, por lo que esta no es la respuesta a la pregunta. –

+0

@ woody121 esta página de stackoverflow fue el resultado de búsqueda de google superior para el método xcode/interface builder para cambiar el controlador de vista raíz. tu respuesta funcionó perfecta, ¡gracias! – tmr

Cuestiones relacionadas