簡體   English   中英

在initWithNibName之前調用ViewDidLoad?

[英]ViewDidLoad being called before initWithNibName?

我有最奇怪的錯誤,我希望有人可以幫助我。 這是我創建視圖控制器並將其推送到navigationController時的代碼。 問題是將隨機變量傳遞給新的視圖控制器。 我嘗試在init方法中傳遞它,並使用下面注釋的行傳遞它。

    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];

但是,當我在MultipleBet的viewDidLoad中訪問隨機變量時,它始終為FALSE。

這是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;
}

這是viewDidLoad的代碼:

- (void)viewDidLoad {
   [super viewDidLoad];


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

}

我聲明變量和屬性,如下所示:

BOOL random;
@property (nonatomic) BOOL random;

並且輸出始終是:
RANDOM2.2:0
RANDOM2:1
RANDOM2.1:1
隨機1:1

為什么viewDidLoad中的NSLog會在所有其他之前輸出? 它應該是最后一個......可能是因為我的自定義init方法? 我叫[super init],所以它應該不是問題...

viewDidLoadinit*方法不能保證一個接一個地執行。 init*方法中的代碼可能導致視圖加載,因此即使init*方法尚未完成,也會調用viewDidLoad

最有可能的是,您省略的部分中的某些代碼會導致視圖加載。 如果您將向我們展示這一部分,也許我們可以指出它。 或者,您也可以移動self.random = isRandom; 將line作為if (self)塊中的第一行,看看是否有效。 這樣,在分配self.random之后,將執行導致視圖加載的任何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;
}

我碰到了這個問題。 我在選擇器中使用self調用方法或屬性,例如self.bannerView.frame或init *方法中的[self createBannerView]。 顯然,self還沒有在那時完成初始化,所以顯然Apple有一些代碼會在訪問屬性或方法之前調用viewDidLoad。 我的解決方案是將調用移出init並將它們放在viewDidLoad中。

可能在您遺漏的部分(...)中,您導致視圖以某種方式加載。 即,在初始化程序中調用setter可能會導致您執行[self.tableView reloadData]或其他操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM