2010-12-03 19 views
15

En una subclase UIViewController, que tienen los siguientes métodos:UIViewController: viewWillAppear se llama, no viewDidAppear

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    // do something 
    myTextField.text = @"Default"; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    // do something 
    [myTextField selectAll:self]; 
    [myTextField becomeFirstResponder]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad];  
    // do something 
    myTextField.delegate = self; 
} 

La SEMILLA se ha creado usando el Interface Builder. El controlador de navegación empuja el objeto del controlador de vista correspondiente a través de pushViewController.

El comportamiento intempestivo es mostrar una entrada de texto predeterminada en un campo de texto, seleccionar el texto completo y establecer el campo de texto como primera respuesta. [Editar: He notado que seleccionar todos los y haciendo que el primer respondedor no tenga sentido ya que la selección desaparecería; aún así, me pregunto por qué los métodos se comportan como se describe a continuación.]

Sin embargo, mientras se invocan los métodos viewDidLoad y viewWillAppear, no se llama al método viewDidAppear. ¿Alguien puede decirme por qué? La mayoría de las preguntas que encontré en la web y que aquí tratan con ambos viewWillAppear/viewDidAppear no funcionan; También entendí que en las subvistas o vistas creadas mediante programación, estos métodos no son evocados; pero esto no se aplica en el caso y también me pregunto por qué uno de estos métodos de "ciclo de vida" se evoca y el otro no.

¿Alguna idea? ¡Gracias!

Respuesta

0

La llamada a viewDidAppear: siempre debe seguir viewWillAppear: a menos que esté haciendo algo personalizado, que usted dice que no. No sé por qué no funciona, pero aquí hay algunas ideas:

¿Podría ser que estás haciendo algo extraño en uno de los métodos delegados para UITextFieldDelegate? Es poco probable que afecte a viewDidAppear:, pero podría ser un culpable.

¿Ha cargado muchas cosas en la memoria antes de empujar la vista? No estoy seguro de qué pasaría si recibiera una advertencia de memoria entre viewWillAppear: y viewDidAppear:.

¿Has intentado hacer un Clean? Algunas veces eso puede ayudar.

En casos como estos, cuando debería funcionar, normalmente creo una nueva clase y la presento una a la vez para ver si puedo hacer que funcione de esa manera. Probé tu código en un nuevo proyecto basado en navegación donde agregué un nuevo UIViewController con una salida al campo de texto. Luego pegué el código de la pregunta y funcionó como se esperaba.

+0

No debería haber un problema de memoria, al menos didReceiveMemoryWarning no se llama. Una limpieza de todos los objetivos no ayudó. Así que seguí tu consejo y paso a paso "copié" la clase en un nuevo proyecto. Y funciona. : -/He agregado todos los métodos que anulo en mi clase original y en un proyecto funciona, en el otro no. En ambos casos, la vista se muestra mediante pushViewController en un controlador de navegación. La única diferencia: en el proyecto de prueba hay un controlador de navegación, en mi proyecto hay tres (el controlador de la raíz es un controlador de tabbar) –

+0

@sven - Quiero cambiar la vista del título de la barra de navegación. Parece que la vista aún no se ha desplazado a la barra de navegación cuando se activa viewWillAppear. – OmniBus

16

Tuve este problema me pasó: viewWillAppear se llamaba pero viewDidAppear no lo era!

finalmente me di cuenta de que esto era porque tenía un tabBarController donde sobrecargado su propio viewDidAppear y se olvidó de la [super viewDidAppear:animated];

Se echó fuera todos los VC en todas las pestañas! agregando esa línea de vuelta en la solucionó para mi otro VC's.

Espero que esto ayude a alguien!

+0

Este fue el caso exacto para mí en mi proyecto Swift. ¡Gracias! –

0

Tuve el mismo problema.

Copié/pegué viewDidAppear para crear viewWillAppear pero olvidé cambiar la llamada super.viewDidAppear(). Esto pareció detener la llamada al viewDidAppear.

Parece que en algún lugar de su código se ha perdido o ha echado a perder una llamada a la superclase.

0

Esto puede deberse a que ha agregado un controlador de vista secundaria a su VC principal en viewDidLoad o viewWillAppear. La apariencia del niño impide la llamada al viewDidAppear.

Esto es algo loco de hacer, y solo sé porque esto fue un error en mi código. Quise añadir el VC infantil a este VC, no al VC principal.

Cuestiones relacionadas