故事板中的元素何时创建?
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
【讨论】:
以上是关于故事板中的元素何时创建?的主要内容,如果未能解决你的问题,请参考以下文章