代码之家  ›  专栏  ›  技术社区  ›  Brian

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

  •  1
  • Brian  · 技术社区  · 10 年前

    我正在使用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. 从代码的角度来看,故事板中的元素何时由iOS创建。(我猜它们会在 viewDidLoad ,但我在测试后发现我错了)

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

    2 回复  |  直到 10 年前
        1
  •  2
  •   Paul.s    10 年前

    中的所有视图元素 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
  •  0
  •   mrosales    10 年前

    应在中创建财产 viewDidLoad ,但在之前无法设置实际的文本财产 viewWillAppear:

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