Ios Can';t通过uiviewcontroller和it的应用程序测试';s UITextField

Ios Can';t通过uiviewcontroller和it的应用程序测试';s UITextField,ios,objective-c,unit-testing,testing,uiviewcontroller,Ios,Objective C,Unit Testing,Testing,Uiviewcontroller,我想检查(测试)一个UIViewController内部的UITextField是否成为第一响应者 以下是我的UIViewController代码: - (void)viewDidLoad { [super viewDidLoad]; [myUITextField becomeFirstResponder]; } 这是我的测试代码: - (void) testThatMyUITextFieldShouldBeFirstResponder { MyViewControll

我想检查(测试)一个UIViewController内部的UITextField是否成为第一响应者

以下是我的UIViewController代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [myUITextField becomeFirstResponder];
}
这是我的测试代码:

- (void) testThatMyUITextFieldShouldBeFirstResponder {
    MyViewController * ViewController =
    [[MyViewController alloc] initWithNibName:nil bundle:nil];
    if (MyViewController) {
        [MyViewController loadView];

        STAssertTrue(MyViewController.myUITextField.isFirstResponder, @"myUITextField is not first responder");
    }
}
虽然行[myUITextField becomeFirstResponder]已正确执行,但isFirstResponder属性不正确


问题是什么?我如何解决它?

问题是当de VC没有完成子视图的布局时,您在viewDidLoad中将其设置为第一响应者。按@viewDidLayoutSubviews、viewWillApear或viewDidapear执行。然后,@您的测试函数添加[MyViewController.view setNeedsLayout]

替换此mathed这将很好地工作,当您创建文本字段时,给它们标记5

-(void) testThatMyUITextFieldShouldBeFirstResponder
{
// get your textfield
for (UIView *view in self.view.subviews)
{
    if ([view isKindOfClass:[UITextField class]])
    {
        UITextField *textField=(UITextField *)view;
        // and get if yoyr textfield tag is 5
        if ((textField.tag==5) &&[textField isFirstResponder])
        {
            NSLog(@"Your TextField is Firstrsponder");
        }

    }
}
}
试试这个:

  • 将断言语句放在单独的函数中
  • 使用下面的方法,在延迟后执行该函数
  • performSelector:withObject:afterDelay:

    UIViewController在loadView完成其执行后调用回调方法viewDidLoad:。它在主调度队列上执行。所以,它必须在测试函数结束后执行。(主队列是一个串行队列,其中一个任务需要在开始下一个任务之前完成)


    使用PerformSelect:时可以避免这种情况,并可以解决此问题。

    我确信调用了view did load函数,但我不明白为什么myUITextField.isFirstResponder属性未设置为“是”!这根本没用!如果有多个文本字段,我知道我的文本字段。是的,有多个!正如我所说,我有权访问它。在这里,我更改了我的答案,并在您的代码中给文本字段标记5