這篇文章主要給大家介紹了關於iOS經驗之初始化方法中不該設置self.view的屬性的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧
前言
iOS初始化方法包括系統默認的和自定義的,常見系統初始化方法有init, initWithFrame:, initWithNibName:bundle:等,自定義則是各式各樣。日常iOS項目開發過程中,我們經常在類的初始化方法中初始化接下來類需要用到的一些必要的數據或界面。
本文主要介紹的是關於iOS初始化方法不設置self.view屬性的相關內容,屬於 iOS小經驗系列:累積平時看起來簡單,但容易忽視的小經驗,各路大佬敬請回避。
正文:
有個小夥伴新寫了一個NextViewController,重新了兩個生命週期:
init
- (instancetype)init{ self = [super init]; if (self) { self.modalPresentationStyle = UIModalPresentationCustom; self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; self.edgesForExtendedLayout = UIRectEdgeNone; self.view.alpha = 0; self.view.backgroundColor = [UIColor clearColor]; } return self; }
viewDidLoad
- (void)viewDidLoad { [super viewDidLoad]; //....根據數據源source顯示列表數據 }
加載代碼
跳轉的時候用這樣的代碼:
- (void)nextButtonClick:(UIButton *)sender { NextViewController *nextVC = [[NextViewController alloc]init]; nextVC.source = [self.source copy]; [self presentViewController:nextVC animated:YES completion:nil]; }
問題描述
結果發現,在執行數據源傳值 nextVC.source = [self.source copy];
代碼之前,NextViewController的 viewDidLoad 死活要先執行,即使還沒執行pushViewController。
問題原因
造成這個問題的原因是在init的方法中設置self.view
相關屬性時,會導致viewDidLoad執行,即使前面的頁面還沒有push過來,即使還沒顯示。
知識小點
不能混淆和亂用生命週期方法,初始化的方法中不該設置self.view的屬性。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對神馬文庫的支持。