【问题标题】: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 为零)。

我想知道:

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

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

【问题讨论】:

    标签: ios cocoa-touch storyboard 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-16
        • 2012-01-26
        • 2013-10-21
        • 2016-11-30
        • 2012-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多