什么时候会创建故事板中的元素?

时间:2014-03-23 16:18:30

标签: ios cocoa-touch storyboard xctest

我正在使用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为nil)。

我想知道:

  1. 从代码的角度来看,故事板中的元素何时由iOS创建。 (我猜他们会在viewDidLoad中创建,但我在测试后发现我错了)

  2. 如何访问XCTest中的元素?

2 个答案:

答案 0 :(得分:2)

加载视图后,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!");

答案 1 :(得分:0)

应在viewDidLoad中创建属性,但在viewWillAppear:

之前无法设置实际的文本属性

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

中的财产