life iphone uiviewcontroller lifecycle

iphone - life - viewdidload viewwillappear



UIViewController: se llama a viewWillAppear, viewDidAppear no (4)

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 que la llamada 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.

En una subclase UIViewController, tengo los siguientes métodos:

-(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; }

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

El comportamiento inteinte es mostrar una entrada de texto predeterminada en un campo de texto, para seleccionar el texto completo y establecer el campo de texto como primer respondedor. [Editar: Me he dado cuenta de que seleccionar todo y hacer 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. ¿Puede alguien 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!


La llamada a viewDidAppear: siempre debe seguir a viewWillAppear: menos que esté haciendo algo personalizado, que diga 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: ser llamado, 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 a la vez para ver si puedo hacer que funcione de esa manera. UIViewController 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.


Me sucedió este problema: viewWillAppear estaba siendo llamado pero viewDidAppear ¡no!

Finalmente me di cuenta de que esto se debía a que tenía un tabBarController donde sobrecargué su propio viewDidAppear y olvidé el [super viewDidAppear:animated];

Lanzó cada VC en cada pestaña! agregando esa línea de vuelta en la arregló para mis otros VC''s .

¡Espero que esto ayude a alguien!


Yo tuve el mismo problema.

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

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