2012-05-28 60 views
3

我有instantiateViewControllerWithIdentifier這樣創建的視圖控制器實例:如何訪問從故事板加載的視圖控制器的屬性?

TBSCTestController* testController = [self.storyboard instantiateViewControllerWithIdentifier: @"OTP"]; 

TBSCTestController有一個名爲labelIBOutlet財產被迷上了在故事板標籤:

IBOutlet albel

我想使用此代碼修改label的文本,但沒有任何更改:

testController.label.text = @"newText"; 
[self.view addSubview: testController.view]; 

testController是一個有效的實例,但label爲零。 我錯過了什麼?

+1

我猜想,你的標籤是不是迷上了到您的IBOutlet,因爲您正在以正確的方式進行操作。 – lnafziger

+0

@lnafziger我已經檢查了我的故事板,並且該標籤已經與我的IBOutlet連接起來了。 –

+1

它應該沒關係,但如果切換最後兩行,該怎麼辦? – lnafziger

回答

9

你的UILabelnil因爲你已經實例化你的控制器,但它沒有加載它的視圖。首次請求訪問其視圖時,控制器的視圖層次結構會被加載。所以,正如@lnafziger建議的那樣(儘管它應該是這個確切的原因很重要),如果你切換兩條線它將工作。所以:

[self.view addSubview: testController.view]; 
testController.label.text = @"newText"; 

舉個例子來說明這一點,即使是這樣一個會工作:

// Just an example. There is no need to do it like this... 
UIView *aView = testController.view; 
testController.label.text = @"newText"; 
[self.view addSubview: testController.view]; 

或者這一個:

[testController loadView]; 
testController.label.text = @"newText"; 
[self.view addSubview: testController.view]; 
+0

它的工作原理!非常感謝,阿拉丁尼亞人。 –

+1

請注意! Apple建議不要直接調用此方法。當你直接調用這個方法時,你不會調用你的ViewDidLoad方法,你會看到一些可能不穩定的行爲。 –

+0

@MarkL這就是爲什麼我有一個說明_There沒有必要這樣做......這只是一個例子,以幫助OP瞭解問題。 – Alladinian

相關問題