[英]Custom UIViewController init with init related data
我有一個關於UIViewControllers
上的自定義init
方法的問題。 假設我編寫了一個帶有一個參數的init
方法(比如說UIViewControllerInitMode
),該參數負責指示視圖應以哪種方式加載。 因此,當調用viewDidLoad
時,將檢查該參數(現在存儲為類變量),並相應地加載與GUI相關的內容。 怎么做?
讓我們來看這個例子:
我們有一個NS_ENUM
稱為UIViewControllerInitMode
與模式kUIViewControllerInitModeOne
和kUIViewControllerInitModeTwo
。 現在查看init
和viewDidLoad
代碼:
- (instancetype)initWithMode:(UIViewControllerInitMode)m
{
self = [super init];
if (self)
{
mode = m; //Assume that mode is a class variable
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
if (mode == kUIViewControllerInitModeOne) //Check the class variable
self.view.backgroundColor = [UIColor blueColor];
else //It's the InitModeTwo
self.view.backgroundColor = [UIColor redColor];
}
現在,這看起來像是一段完全合法的代碼(至少對我來說是這樣),但是如果我的知識是正確的,則將UIViewController
的實際視圖延遲加載,因此在設置類變量時,無法判斷視圖是藍色還是紅色(除非有一個額外的if,但這看起來很難看,因為這意味着我在init
和viewDidLoad
具有相同的GUI代碼。 那么,這是否意味着在某些情況下,即使我使用應該使背景變成藍色的模式init
了控制器,該視圖也可能具有紅色背景? 出於同樣的原因,在init
設置背景顏色還是不安全的? 如果我按照上述示例的方式進行操作,它總是可以工作的,但是我想深入了解這一點。 這是怎么發生的呢? 我在哪里是對還是錯?
您的例子很好。 您可以在創建視圖屬性后對其進行設置。 當您的更改未顯示時,您可以通過調用
[self.view setNeedsDisplay];
我猜在init中設置背景顏色會失敗,因為視圖尚未在init中初始化。 但是我不確定。 去嘗試一下。
我認為上面的代碼沒有問題。 沒錯,您不應該觸摸init
UI組件,因為那時UI組件很可能為null
。 initWithMode
方法不應該在乎視圖是什么顏色,因為它可能根本沒有顏色。 viewDidLoad
方法用於更改視圖和其他UI組件的顯示屬性。 由於init
將始終在viewDidLoad
之前被調用,因此您應根據mode
將視圖始終設置為紅色或藍色。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.