2013-08-28 118 views
2

一個相當基本的問題,我不確定。我通常會建立我UIViewController的觀點相關的代碼在viewDidLoad。如果控制器具有標籤等的一些屬性,這是我將初始化它們並將它們添加到視圖中的位置。這些屬性通常在.m中聲明,因此可以被認爲是僞私有的。在哪裏設置屬性在UIViewController中

但是,如果控制器在其頭文件中公開了其中一個屬性(假設爲UILabel),我發現在設置它時不能依賴它。例如:

CustomViewController *controller = [CustomViewController alloc] initWithNibName:nil bundle:nil]; 
controller.someLabel.text = @"label text goes here"; 
//then comes the presentation code 

我發現,我設置標籤的文本太早 - viewDidLoad還沒有啓動這樣的標籤是零。

,我應該init創建此標籤,並在viewDidLoad增加嗎?我應該盡我所有在init?或者,也許所有的視圖屬性的初始化?或者根據具體情況對其進行判斷?

或者,也許根本原因是,我不應該有一個控制器暴露一個視圖(標籤),並使用一些其他的模式?

我正在尋找一個一致的方法來組織我的代碼。

+0

如果它是由時間的viewDidLoad大火做好準備,那麼這將是罰款,因爲是viewDidLoad中發生之前將其設置在初始化。 – Jeremy

+0

是的,我只是偶爾以某種方式做這件事,而在其他時候以另一種方式做。猜猜我應該更務實。 –

+1

你會在哪裏試圖打電話給你的代碼?從另一個控制器?如果是這樣,您需要將該字符串傳遞給CustomController中的字符串屬性,並讓它將標籤的文本設置爲viewDidLoad。從MVC的角度來看,讓控制器填充自己的用戶界面更好,因此傳遞數據需要做的是正確的方式。 – rdelmar

回答

3

呀,你是非常正確的了。事情是,直到實際呈現視圖之前,控制器的所有視圖組件都不會被加載。所以你不能從控制器外部設置任何你的IBOutlets。

例如,爲UILabel傳遞文本的一種方法是,創建一個新的字符串屬性,例如self.myString,從外部分配它,並在viewDidLoad中設置標籤的文本屬性。

CustomViewController *controller = [CustomViewController alloc] initWithNibName:nil bundle:nil]; 
controller.myString = @"label text goes here"; 

而且CustomViewController內:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    (...) 
    self.label.text = self.myString; 
} 
+0

而且我還需要一個客戶二傳手嗎?否則[控制器setMyString:]將不會更新文本字段。 –

+0

我不這麼認爲。這個輔助屬性只有在這種情況下才有必要和使用,其中viewController被分配但尚未出現。在我的例子中,文本已經在'viewDidLoad'中設置了,所以你不需要自定義設置器。如果您想在課程外的其他地方再次更改標籤的文本,則在顯示視圖後,您可以直接使用IBOutlet。 –

+0

但是,我必須記住,如果它在視圖加載之前(字符串)使用一個屬性,另一個如果它的後面(標籤直接)(我在代碼中完成所有這些,所以沒有插座)。 –

1

我傾向於做類似以下的事情,如果我只想更新頻率更高的視頻(如果我想更頻繁地更新視頻,我會在viewWillAppear或通過KVO或其他通知機制)。

有確實根據的財產我的UI設置一些私有方法:

- (void)_updateUIForProperty { 
    // Handle UI update 
} 

實現對我的公共屬性的設置調用_updateUIForProperty方法如果視圖已經被加載:

- (void)setProperty:(<#property type#>)property { 
    _property = property; 

    if(self.isViewLoaded) { 
     [self _updateUIForProperty]; 
    } 
} 

然後爲了處理在視圖加載之前設置屬性的情況,我們在viewDidLoad中做這樣的事情:

- (void)viewDidLoad { 
    // Other initialization 

    if(_property != nil) { 
     [self _updateUIForProperty]; 
    } 
} 
相關問題