2011-02-01 4 views
7

J'ai l'erreur la plus étrange, et j'espère que quelqu'un pourrait m'aider. Voici le code quand je crée un contrôleur de vue et le pousse à navigationController. le problème est de transmettre la variable aléatoire au nouveau contrôleur de vue. J'ai essayé de le passer dans la méthode init et de le passer avec la ligne commentée ci-dessous.ViewDidLoad étant appelé avant 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]; 

Cependant, lorsque je avoir accès à la variable aléatoire dans le viewDidLoad du MultipleBet, il est toujours faux.

ici est le code du 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; 
} 

et voici le code du viewDidLoad:

- (void)viewDidLoad { 
    [super viewDidLoad]; 


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

} 

i Déclarez la variable et la propriété comme ceci:

BOOL random; 
@property (nonatomic) BOOL random; 

et la sortie est toujours:
RANDOM2.2: 0
RANDOM2: 1
RANDOM2.1: 1
RANDOM1: 1

Pourquoi la NSLog du viewDidLoad avant d'être émis en sortie tous les autres? ça devrait être le dernier ... Serait-ce à cause de ma méthode init personnalisée? J'appelle le [super init], donc ça ne devrait pas poser de problème ...

Répondre

20

viewDidLoad et init* ne sont pas garanties d'être exécutées les unes après les autres. Code dans vos méthodes init* peut provoquer le chargement de la vue, par conséquent viewDidLoad sera appelée même si la méthode init* n'a pas terminé. Il est très probable qu'un code dans la partie que vous avez omise entraîne le chargement de la vue. Si vous nous montrez cette partie, peut-être que nous pouvons le signaler. Ou, vous pouvez également déplacer la ligne self.random = isRandom; en tant que première ligne à l'intérieur de votre bloc if (self) et voir si cela fonctionne. De cette façon, tout ce qui provoque le chargement de la vue sera exécuté après avoir attribué 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

oui, c'était ça :) dans la méthode init j'appelais [self.view addSubview: quelque chose] et ça appelait viewDidLoad ... j'ai changé le self.random = isRandom au début de la méthode et J'ai résolu mon problème ... je pensais que viewDidLoad était toujours appelé après l'init;) – ffleandro

+0

Je me fais toujours un devoir d'assigner les variables que je passe à init * au début de la méthode pour éviter d'avoir des problèmes comme ceux-ci. Cela résout le problème, non? Veuillez marquer la réponse comme acceptée en cliquant sur la coche à gauche. Merci!:) – Altealice

+1

cela m'a sauvé après une longue période! J'étais initWithFrame-ing un de mes sous-vues avec 'CGRectGetWidth ([self.view bounds])' Merci! – minovsky

0

Probablement dans la partie que vous avez omise (...) vous faites charger la vue d'une façon ou d'une autre. Par exemple, l'appel d'un setter dans l'initialiseur peut vous amener à faire un [self.tableView reloadData] ou quelque chose de ce genre. Les méthodes

1

Je suis tombé sur ce problème. J'appelais une méthode ou une propriété avec soi dans le sélecteur, par ex. self.bannerView.frame ou [self createBannerView] à partir de la méthode init *. Évidemment, l'initialisation de self n'est pas terminée à ce stade, donc apparemment Apple a du code qui appellera viewDidLoad avant d'accéder aux propriétés ou aux méthodes. Ma solution était de sortir les appels d'init et de les placer dans viewDidLoad.

Questions connexes