2012-05-28 61 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

相关问题