2011-02-01 10 views
7

Sto avendo l'errore più strano, e spero che qualcuno possa aiutarmi. Ecco il codice quando creo un controller di visualizzazione e lo spingo a navigationController. il problema è passare la variabile casuale al nuovo controller di visualizzazione. Ho provato a passarlo nel metodo init e anche a passarlo con la riga commentata di seguito.ViewDidLoad viene chiamato prima di 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]; 

Tuttavia quando accedo la variabile casuale nel viewDidLoad del MultipleBet, è sempre FALSE.

ecco il codice del 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; 
} 

e qui è il codice del viewDidLoad:

- (void)viewDidLoad { 
    [super viewDidLoad]; 


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

} 

dichiaro la variabile e proprietà come questa:

BOOL random; 
@property (nonatomic) BOOL random; 

e l'output è sempre:
RANDOM2.2: 0
random2: 1
RANDOM2.1: 1
RANDOM1: 1

Perché la NSLog dal viewDidLoad in fase di uscita prima di tutti gli altri? dovrebbe essere l'ultimo ... Potrebbe essere a causa del mio metodo init personalizzato? Io chiamo [super init], quindi non dovrebbe essere un problema ...

risposta

20

viewDidLoad e init* non è possibile eseguire uno dopo l'altro i metodi. Il codice nei tuoi metodi init* potrebbe causare il caricamento della vista, quindi verrà chiamato viewDidLoad anche se il metodo init* non è stato completato.

Molto probabilmente, un codice nella parte che hai omesso sta causando il caricamento della vista. Se ci mostrerai quella parte, forse potremo indicarla. Oppure puoi anche spostare la linea self.random = isRandom; come prima riga all'interno del tuo blocco if (self) e vedere se funziona. In questo modo, qualunque cosa causi il caricamento della vista verrà eseguita dopo aver assegnato 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ì, era così :) nel metodo init stavo chiamando [self.view addSubview: qualcosa] e che stava chiamando viewDidLoad ... ho cambiato il self.random = isRandom all'inizio del metodo e ho risolto il mio problema ... pensavo che viewDidLoad venisse sempre chiamato dopo l'init;) – ffleandro

+0

Ho sempre pensato di assegnare le variabili che passo a init * all'inizio del metodo per evitare problemi come questi. Questo risolve il problema, giusto? Si prega di contrassegnare la risposta come accettata facendo clic sul segno di spunta sulla sinistra. Grazie!:) – Altealice

+1

questo mi ha salvato dopo tanto tempo! Ero initWithFrame di una delle mie sottoview con 'CGRectGetWidth ([self.view bounds])' Grazie !! – minovsky

0

Probabilmente nella parte che hai tralasciato (...) stai causando il caricamento della vista in qualche modo. Ad esempio, chiamare un setter nell'inizializzatore potrebbe causare un [self.tableView reloadData] o qualcosa del genere.

1

Mi sono imbattuto in questo problema. Stavo chiamando un metodo o una proprietà con sé nel selettore, ad es. self.bannerView.frame o [self createBannerView] dal metodo init *. Ovviamente, l'inizializzazione automatica non è completata a quel punto, quindi apparentemente Apple ha un codice che chiamerà viewDidLoad prima di accedere a proprietà o metodi. La mia soluzione era spostare le chiamate da init e inserirle in viewDidLoad.

Problemi correlati