2010-07-02 8 views

Respuesta

0

No, el mensaje viewDidLoad siempre se llama después de init.

¿Estás seguro de que se llama init en absoluto? Hay varios métodos de inicio especialmente para UIViewController, tal vez se llame a otro en lugar de hacerlo pensar de manera diferente.

Si necesita más información, pegue el código de viewDidLoad y todos sus métodos de inicio, y díganos cómo se carga (es decir, con código) o desde un plumín.

+1

Sí, init está llamando pero después de viewDidLoad. Para ese UIViewController en particular, solo alloc e init. y configurar ese controlador en un UITabBarController como un controlador de vista y presentar el tabbarController? ¿Hay algo mal aquí? –

+0

Init se ejecuta antes de viewDidLoad, a menos que lo arruines realmente muy mal, lo que es muy poco probable. Te estás perdiendo otro init o sacas conclusiones equivocadas. ¿Qué te hace pensar que se invoca init después de viewDidLoad? ¿Y has comprobado que este es el mismo objeto? De nuevo, sin código, no hay forma de verificarlo. – Eiko

0

Si su ViewController se está cargando desde su archivo de punta principal, lo más probable es que se llame a initWithCoder para inicializar el controlador.

3

Al inicializar un UIViewController de código, se utiliza -initWithNibName:bundle:, mientras que cuando se inicializa desde un XI ter, el código de carga XI ter llamará -initWithCoder:. Uno, y solo se llamará a uno de estos dos métodos, y definitivamente se llamarán antes del -viewDidLoad.

No hay forma concebible de que se llame primero a -viewDidLoad, a menos que lo llame usted mismo (lo que nunca debería hacer).

11

Sé que esta es una publicación un poco antigua, pero publicaré mi punto de vista en cualquier lugar porque creo que podría ayudar a alguien.

Bueno, he estado en esta misma situación. Pensé que se llamaba a viewDidLoad antes del método init en mi clase de controlador de vista. Pero lo que realmente estaba sucediendo no era eso: el flujo comienza en el método init, pero salta a viewDidLoad cuando se llama a [super init *], por lo que mis mensajes de registro en el método viewDidLoad se mostraban primero que aquellos en mi inicialización personalizada.

Creo que eso es todo. Espero que esto le ahorre tiempo a alguien.

[Lo siento por mi Inglés]

+0

¡Gran observación! –

34

El método viewDidLoad se está llamando al acceder self.view dentro del método init (ya self.view no debe sin embargo ser cargado desde la punta del proceso parece ser sujetar por lo que no vuelve nulo).

+4

Así que gracias. self.view in init fue mi gran problema. –

+1

Gracias, moví todas las actividades de selfview a viewDidLoad, y cambié todas las propiedades que necesitaba en mi inicializador designado de self.property a _property. Resolvió todo. – Jonauz

+0

Último comentario, me encontré con este mismo problema, pero estoy confundido ¿cómo? ¿Simplemente pasa el constructor? –

3

No sé qué tipo de viewController causó esto para usted, pero me enfrenté a un caso similar con UITabBarController. Pensé que podría ayudar a otro que se enfrenta con UITabBarController.
Como sé, todos los controles de vista llaman a init antes de viewDidLoad, a excepción del UITabBarController y sus subclases.
Como Andrew afirma here, UITabBarControllers llama a loadView dentro del método [super init], que causa la llamada a viewDidLoad. Entonces se llamará al método viewDidLoad antes de que init haya terminado.
Si tiene algo para configurar en viewDidLoad, quizás deba hacerlo dentro del método init después de la llamada al [super init].

Cuestiones relacionadas