Pregunta de UIViewController para iPhone / iPad

Tengo una aplicación con un archivo MainWindow.xib. Entonces tengo ViewControllerA.xib y ViewControllerB.xib. Mi MainWindow.xib tiene un ViewController que apunta a dos ViewControllerA.xib.

En ViewControllerA tengo un botón y me gustaría que el botón, cuando se presiona, mueva ViewControllerB a la pantalla. ¿Cómo puedo hacer eso?

Probé este código, pero creo que me falta algo:

- (IBAction)btMyButton:(id)sender
{
    ViewControllerB * viewController = [[ViewControllerB alloc] initWithNibName:@"ViewControllerB" bundle:nil];
    [[UIApplication sharedApplication].keyWindow addSubview:viewController.view];
    [self.navigationController pushViewController:viewController animated:YES];
}

Mi ViewControllerB aparece, pero está aplastado en la parte superior de la pantalla, sobre la vista anterior. Cualquier ayuda es muy apreciada.

Gracias

preguntado el 16 de mayo de 11 a las 19:05

si no está utilizando un proyecto de controlador de navegación, es probable que su self.navigationController no se agregue a la ventana, y probablemente también sea nulo. -

Sí, tienes razón, no tengo un NavigationController. ¿Debería? Pensé que si ponía un NavigationController tendría la barra en la parte superior. No quiero que la barra en la parte superior de la primera pantalla, pero cuando el usuario haga clic en el botón, iré a la vista del controlador de navegación. -

no necesita tener una barra si no lo desea, puede usar [self presentModalViewController: animated:] si solo desea presionar un controlador de vista, luego llame a dissmissModelViewController: animated: en la vista que llamó presente. .. esto se puede hacer a través de self.parentViewController. -

El controlador de navegación debe tener una salida en el delegado de la aplicación, puede ocultarlo en su primera pantalla si lo desea. -

pero probablemente debería comenzar un nuevo proyecto de navegación y ver cómo se agrega el controlador de navegación, luego usarlo, incluso si oculta la barra de navegación. -

3 Respuestas

Asegúrese de que la vista del controlador B tenga la altura correcta; debe restar la altura de la barra de navegación 44 px y la barra de estado 20 px también. Esos valores son para iPhone.

  - (IBAction)btMyButton:(id)sender
    {
        //you should load from the main app bundle
        ViewControllerB * viewController = [[ViewControllerB alloc] initWithNibName:@"ViewControllerB" bundle:[NSBundle mainBundle]];
        // you don't need the following line      
        //[[UIApplication sharedApplication].keyWindow addSubview:viewController.view];
        [self.navigationController pushViewController:viewController animated:YES];
        [viewController release];
    }

Noticias Como dice el comentario anterior, si es posible que no tenga un controlador de navegación para insertar el Controlador B. Por lo tanto, agregue un controlador de navegación en la ventana principal en lugar del controlador de vista y haga que su controlador de vista raíz sea el Controlador A.

Espero que esto te ayude,

contestado el 16 de mayo de 11 a las 23:05

Quite la segunda línea:

[[UIApplication sharedApplication].keyWindow addSubview:viewController.view];

Estás agregando la vista dos veces. Tanto la segunda como la tercera línea hacen que la vista se agregue a la jerarquía de vistas en diferentes lugares.

--update-- Si elimina la segunda línea y no ve su vista, es muy probable que self.navigationController sea nulo. Pruebe [self presentModalViewController:] en su lugar.

contestado el 16 de mayo de 11 a las 23:05

Sí, lo eliminé y luego no pasa nada y no veo el ViewControllerB en absoluto. Además, para tener en cuenta, tengo este botón en mi clase ViewControllerA. ¿Entonces me estaba cuestionando el yo? - LilMoke

deberá eliminar el controlador de vista antiguo de las ventanas principales.

- (IBAction)btMyButton:(id)sender
{

//Assuming you declare two Iboutlet controllerA, controllerB mapping with that view as class variable
{
if (self.controllerB == nil)
{
    ViewControllerB * viewController = [[ViewControllerB alloc] initWithNibName:@"ViewControllerB" bundle:nil];
    self.controllerB = viewController;
[viewController release];
}
[controllerA.view removeFromSuperview];
[self.view insertSubview:controllerB.view atIndex:0];
}

}

contestado el 16 de mayo de 11 a las 23:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.