ViewController addSubview

Estoy casi volviendo loca:

GolOlurActionViewController *golOlur = [[GolOlurActionViewController alloc] init]; [self.view addSubview:golOlur.view]; 

Tengo el código anterior y lo IBACtion en un IBACtion dentro de ViewController . GolOlurActionViewController es un ViewController como todos pueden adivinar.

Cuando se inicia el process, se invocan los methods viewDidLoad y viewDidAppear , pero la vista no se presenta.

He intentado todo lo que sé pero no pude resolver esto.

Realmente no debería usar addSubview si su intención es la transición entre vistas. Si lo haces, no recibirás events de rotation porque estás permitiendo que tu jerarquía del controller de vista no esté sincronizada con la jerarquía de la vista. Debe usar addSubview solo para agregar una subvista verdadera (p. Ej., Una UILabel , una UIImageView , un UIButton , etc., o, la vista secundaria si está haciendo la contención apropiada del controller de vista, etc.) en una vista. El uso de addSubview para la transición entre vistas representa una confusión fundamental entre los controlleres de vista y las vistas.

La key para la correcta administración de sus vistas es asegurarse de que la jerarquía de su controller de vista esté sincronizada con la jerarquía de su vista. La forma más fácil de hacerlo es hacer la transición entre los controlleres de vista y dejar que se encarguen de la presentación de sus vistas. Por lo tanto, si está utilizando NIB, generalmente sería:

 GolOlurActionViewController *golOlur = [[GolOlurActionViewController alloc] initWithNibName:nil bundle:nil]; [self presentViewController:golOlur animated:YES completion:nil]; 

O bien, NIB con controller de navigation:

 GolOlurActionViewController *golOlur = [[GolOlurActionViewController alloc] initWithNibName:nil bundle:nil]; [self.navigationController pushViewController:golOlur animated:YES]; 

O bien, si está utilizando storyboards (una vez más, si estuviera usando storyboards, probablemente usaría segues y no necesitaría nada de esto, sino solo para completar):

 GolOlurActionViewController *golOlur = [self.storyboard instantiateViewControllerWithIdentifier:@"GolOlurActionView"]; [self presentViewController:golOlur animated:YES completion:nil]; 

y si sus storyboards utilizan controlleres de navigation:

 GolOlurActionViewController *golOlur = [self.storyboard instantiateViewControllerWithIdentifier:@"GolOlurActionView"]; [self.navigationController pushViewController:pushViewController:golOlur animated:YES]; 

En el improbable caso de que esté tratando de didMoveToParentViewController , didMoveToParentViewController , porque eso es ligeramente diferente (requiere llamadas a addChildViewController y didMoveToParentViewController ), pero si realiza una transición básica entre vistas, la initialization correcta de su controller y el posterior La llamada a presentViewController o pushViewController debería hacerlo por usted.

Actualizar:

Como un rápido aparte, si está utilizando storyboards (no creo que lo sea, pero por las dudas), en lugar de instantiateViewControllerWithIdentifier , podría sugerirle que defina una segue en el guión gráfico, proporcione una cadena de identificación en la interfaz Builder, y luego usa el siguiente código para pasar a la siguiente escena:

 [self performSegueWithIdentifier:@"yourIdentifier" sender:self]; 

Si lo haces de esta manera, se encargará de crear una instancia de tu controller y el flujo de toda tu aplicación se representará con precisión en el guión gráfico.

Creo que su problema es que espera que la vista en un storyboard o .xib aparezca cuando crea un UIViewController tal como es, lo que no funcionará. UINavigationController conectar un segue push en el storyboard (que requerirá un UINavigationController ), o presentar el nuevo controller de manera modal, lo que también puede hacer en el storyboard. Si tiene una punta para este ViewController, puede hacer esto:

  CustomViewController *controller = [[CustomViewController alloc] initWithNibName:@"CustomViewController.xib" bundle:[NSBundle mainBundle]]; [self presentViewController:controller animated:YES completion:NULL];