我想检查(测试) 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属性不正确。
问题是什么?如何解决?
答案 0 :(得分:0)
问题是你在viewDidLoad中将它设置为第一响应者,当de VC没有完成布局子视图时。做它@ viewDidLayoutSubviews,viewWillApear或viewDidapear。然后,@你的测试函数添加[MyViewController.view setNeedsLayout];
答案 1 :(得分:0)
替换这个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");
}
}
}
}
答案 2 :(得分:0)
试试这个:
performSelector:withObject:afterDelay:
UIViewController在loadView完成执行后调用回调方法viewDidLoad:它在主调度队列上执行。因此,必须在测试功能结束后执行。 (主队列是一个串行队列,其中一个任务需要在开始下一个任务之前完成)
使用performSelector:时可以避免这种情况,并且可以解决问题。