1. 程式人生 > >UITabbarController的子類,init 和 viewDidLoad 的順序

UITabbarController的子類,init 和 viewDidLoad 的順序

原文地址: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
//{
//    
//}