故事板中的元素何时创建?

Posted

技术标签:

【中文标题】故事板中的元素何时创建?【英文标题】:When will elements in storyboard be created? 【发布时间】:2014-03-23 16:18:29 【问题描述】:

我正在使用 XCTest 测试我的视图控制器。

我必须验证我的textfield,所以我从我的情节提要中初始化了一个视图控制器并尝试访问textfiled

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *vc = (ViewController *)[sb instantiateViewControllerWithIdentifier:@"ViewController"];
XCTAssertNotNil(_vc.emailField, @"email field is nil!"); // fail

如果我使用模拟器手动测试此视图控制器,我可以访问emailField 并为其设置/获取值,但我无法通过我的代码访问它(_vc.emailField 为零)。

我想知道:

    从代码的角度来看,Storyboard中的元素什么时候会被ios创建。 (我猜他们会在viewDidLoad创建,但我测试后发现我错了)

    如何访问 XCTest 中的元素?

【问题讨论】:

【参考方案1】:

xib 中的所有视图元素都将在视图加载后可用。问题是您实际上从未导致加载视图。

您应该调用viewController.view,这将导致加载视图并连接所有出口。

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *vc = (ViewController *)[sb instantiateViewControllerWithIdentifier:@"ViewController"];

__unused UIView *view = _vc.view; // cause the view to be loaded

XCTAssertNotNil(_vc.emailField, @"email field is nil!");

【讨论】:

【参考方案2】:

属性应该在viewDidLoad中创建,但是设置实际的文本属性要到viewWillAppear:才能完成

我解决此问题的方法是向视图控制器添加另一个属性以包含数据(因为视图不应该是任何存储数据的主要所有者)并将vc.emailField.text 的值设置为该属性viewWillAppear

【讨论】:

以上是关于故事板中的元素何时创建?的主要内容,如果未能解决你的问题,请参考以下文章

故事板中 tableviewController 中的原型 tableview 单元格

XCode故事板中的自定义静态表格单元格?

故事板中的 UILabel 子类外观

故事板中的自定义导航控制器

当按钮逻辑失败时停止故事板中的 segue

故事板中tableviewController中的原型tableview单元格