2011-02-01 15 views
7

Tengo el error más extraño, y espero que alguien pueda ayudarme. Aquí está el código cuando creo un controlador de vista y lo presiono a navigationController. el problema es pasar la variable aleatoria al nuevo controlador de vista. Intenté pasarlo en el método init y también pasarlo con la línea comentada a continuación.¿Se está llamando a ViewDidLoad antes de initWithNibName?

MultipleBet *multipleBet = [[MultipleBet alloc] initWithMaxNumber:numbers andMaxStars:stars andRandom:self.random]; 
    NSLog(@"RANDOM1: %d", self.random); 
    //[multipleBet setRandom:self.random]; 

    UIBarButtonItem *backButton = [[[UIBarButtonItem alloc] init] autorelease]; 
    backButton.title = @"Voltar"; 
    self.navigationItem.backBarButtonItem = backButton; 
    [self.navigationController pushViewController:multipleBet animated:YES]; 

    [multipleBet release]; 

Sin embargo, cuando tengo acceso a la variable aleatoria en el viewDidLoad del MultipleBet, siempre es FALSO.

aquí es el código de la MultipleBet:

- (id)initWithMaxNumber:(int)maxNumbers andMaxStars:(int)maxStars andRandom:(BOOL)isRandom { 
    self = [super initWithNibName:@"MultipleBet" bundle:[NSBundle mainBundle]]; 
    ... 

    self.random = isRandom; 
    NSLog(@"RANDOM2: %d", self.random); 
    NSLog(@"RANDOM2.1: %d", isRandom); 

return self; 
} 

y aquí está el código de la viewDidLoad:

- (void)viewDidLoad { 
    [super viewDidLoad]; 


    NSLog(@"RANDOM2.2: %d", self.random); 

} 

Declaro la variable y la propiedad como esta:

BOOL random; 
@property (nonatomic) BOOL random; 

y la salida es siempre:
RANDOM2.2: 0
random2: 1
RANDOM2.1: 1
RANDOM1: 1

¿Por qué el NSLog del viewDidLoad que se emite antes de que todos los demás? debería ser el último ... ¿Podría ser por mi método init personalizado? Llamo al [superinicio], por lo que no debería ser un problema ...

Respuesta

20

viewDidLoad y init* no se garantiza que los métodos se ejecuten uno después del otro. Código en sus métodos init* puede causar que la vista se cargue, por lo tanto se llamará viewDidLoad incluso si el método init* no ha finalizado.

Lo más probable es que algún código en la pieza que ha omitido está causando que la vista se cargue. Si nos muestras esa parte, tal vez podamos señalarlo. O bien, también puede mover la línea self.random = isRandom; como la primera línea dentro de su bloque if (self) y ver si eso funciona. De esta forma, lo que está causando que se cargue la vista se ejecutará después de que haya asignado self.random.

- (id)initWithMaxNumber:(int)maxNumbers andMaxStars:(int)maxStars andRandom:(BOOL)isRandom { 
    self = [super initWithNibName:@"MultipleBet" bundle:[NSBundle mainBundle]]; 
    if (self) { 
     // do this first 
     self.random = isRandom; 
     NSLog(@"RANDOM2: %d", self.random); 
     NSLog(@"RANDOM2.1: %d", isRandom); 

     // do the other code after 
     ... 
    } 

    return self; 
} 
+1

sí, eso fue :) en el método init estaba llamando [self.view addSubview: algo] y que estaba llamando a viewDidLoad ... cambié el self.random = isRandom al comienzo del método y Resolvió mi problema ... pensé que se llamaba a viewDidLoad después del init;) – ffleandro

+0

Siempre hago un punto para asignar las variables que paso a init * al comienzo del método para evitar problemas como estos. Esto resuelve el problema, ¿verdad? Marque la respuesta como aceptada haciendo clic en la marca de verificación a la izquierda. ¡Gracias!:) – Altealice

+1

esto me salvó después de un largo tiempo! Fui initWithFrame-ing una de mis subvistas con 'CGRectGetWidth ([self.view bounds])' ¡Gracias! – minovsky

0

Probablemente en la parte que dejó afuera (...) está causando que la vista se cargue de alguna manera. Es decir, llamar a un colocador en el inicializador puede hacer que realice un [self.tableView reloadData] o algo así.

1

Me encontré con este problema. Estaba llamando un método o una propiedad consigo mismo en el selector, p. self.bannerView.frame o [self createBannerView] desde el método init *. Obviamente, self no se completa la inicialización en ese punto, por lo que aparentemente Apple tiene algún código que llamará a viewDidLoad antes de acceder a propiedades o métodos. Mi solución fue mover las llamadas desde init y colocarlas en viewDidLoad.

Cuestiones relacionadas