[英]init and initWithNibName are not called but viewDidLoad is called
[英]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],所以它應該不是問題...
viewDidLoad
和init*
方法不能保證一個接一個地執行。 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.