UITabbarController的子類,init 和 viewDidLoad 的順序
阿新 • • 發佈:2019-01-26
原文地址:http://www.andrewmonshizadeh.com/2015/02/23/uitabbarcontroller-is-different/
今天新建了個 UITabBarController 的子類,從一個 Controller 用 present 的方式彈出 這個UITabBarController的子類Controller。奇怪的是 在該子類Controller裡init方法的時候呼叫了 viewdidload,導致每次傳值的時候都會在viewdidload載入完了之後傳的值才能傳過去。後來看了上面的帖子,UITabBarController在呼叫【super init】的時候,系統肯定呼叫了self.view的東西,但是此時view還沒加載出來,於是系統強制先呼叫viewdidload去載入self.view,最後載入完了,再接著走init方法中的 if(self)條件語句。具體的文中也說道,其實UITabBarController在init的時候,會增UITabbar到self.view,這時候必須載入self.view出來,從而就呼叫了loadview,進而呼叫viewdidload、viewwillappear等。這個是UITabBarController的特性。
解決方案:就是不要在viewdidload和viewwillappear等方法裡寫載入介面的程式碼,可以單獨再寫個方法,直接在init結束的時候呼叫。所以我的建議就是直接把viewdidload和viewwillappear方法刪了,載入介面全都在init裡寫,如下:
- (instancetype)init
{
self = [super init];
if (self) {
//載入介面
}
return self;
}
//下面這倆方法直接遮蔽就可以了 //- (void)viewDidLoad //{ // [super viewDidLoad]; // // //} // //- (void)viewWillAppear:(BOOL)animated //{ // //}