簡體   English   中英

自定義UIViewController init與init相關的數據

[英]Custom UIViewController init with init related data

我有一個關於UIViewControllers上的自定義init方法的問題。 假設我編寫了一個帶有一個參數的init方法(比如說UIViewControllerInitMode ),該參數負責指示視圖應以哪種方式加載。 因此,當調用viewDidLoad時,將檢查該參數(現在存儲為類變量),並相應地加載與GUI相關的內容。 怎么做?

讓我們來看這個例子:

我們有一個NS_ENUM稱為UIViewControllerInitMode與模式kUIViewControllerInitModeOnekUIViewControllerInitModeTwo 現在查看initviewDidLoad代碼:

- (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,但這看起來很難看,因為這意味着我在initviewDidLoad具有相同的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM