UIViewController init方法裡面呼叫self.view的問題
阿新 • • 發佈:2019-02-06
【在UIViewController的init方法中對self.view進行設定需要謹慎】
今天在專案中用到了一個UIViewController的子類,重寫了其初始化方法,並在初始化方法中通過self.view setFrame:方法對其大小進行了修改。結果介面上的內容都沒有了,糾結了半天才恍然大悟,血的教訓啊!!!
事情是這樣子的:
以下是純記事本寫的程式碼,偽碼算是。
@interface ViewControllerA:UIViewController
{
}
@property(nonamic,retain)ClassB * classB;
@implementation ViewControllerA
@sythesize classB;
-(id)initWithAClassB:(ClassB *)b //假如傳進來的b的value屬性=10;
{
if(self = [super init])
{
[self.view setFrame:CGRectMake(0,0,100,100)];
self.classB = b;
//呼叫其他方法
NSLog(@"when init b.value = %d",self.classB.value);
}
return self;
}
-(void)viewDidLoad
{
[super viewDidLoad];
[self addSubViews];
//呼叫其他方法
NSLog(@"when didload b.value = %d",self.classB.value);
//此處呼叫的方法用到了self.classB.value值,但是每次執行都發現傳進來的值並不是10,而是預設的0
}
-(void)addSubViews
{
//程式碼塊
NSLog(@"when addSubViews b.value = %d",self.classB.value);
}
結果輸出了:
when addSubViews b.value = 0
when didload b.value = 0
when init b.value = 0
===================================================================
我就納悶兒了,明明是先init再didload的呀,為什麼輸出順序是這樣子的呢?
後來好好仔細檢查了一遍程式碼,發現在self.classB = b;賦值之前呼叫了self.view,這個時候self.view還沒有,所以要去先載入view,所以導致了這種情況。以前瞎寫,完全沒有注意到有這個問題,今天漲姿勢了。。。