为什么UITextField成为FirstResponder返回NO?

这是我的代码:

while (true) { if ([identificationField becomeFirstResponder]) { NSLog(@"finally!"); break; } else{ if ([identificationField canBecomeFirstResponder]) { NSLog(@"can"); } else{ NSLog(@"cannot"); } NSLog(@"%@", identificationField); NSLog(@"dadgum!!"); } } 

这是它记录的内容:

  2014-02-05 11:33:54.253 Store Test[22488:70b] can 2014-02-05 11:33:54.254 Store Test[22488:70b] <UITextField: 0xb5c89a0; frame = (10 1; 300 43); text = ''; clipsToBounds = YES; opaque = NO; autoresize = TM+BM; gestureRecognizers = ; layer = > 2014-02-05 11:33:54.254 Store Test[22488:70b] dadgum!! 

有谁知道为什么会这样做? 如您所见,文本字段可以成为第一个响应者,它不会。

你的identifyField是否在UIView层次结构中? 如果它没有添加到窗口并显示它不能成为第一响应者。

如果我刚刚发现其userInteractionEnabled属性为NOUITextField也将拒绝成为第一响应者。 在接受第一响应者状态之前,我必须在文本字段上明确重新启用用户交互。

另外值得注意的是,您可以强制当前具有第一响应者状态的任何元素通过在包含当前第一响应者的任何[UIView endEditing:YES]视图上调用[UIView endEditing:YES]来放弃它。

你可能有另一个元素阻止它。 需要了解更多关于您的项目才能真正回答确切的问题。

但是,您可以使用另一个具有委托方法的textField

 - (BOOL)textFieldShouldEndEditing:(UITextField *)textField{ return NO; } 

这意味着它不会让第一响应者辞职。

canBecomeFirstResponder的调用仅检查接收者本身是否能成为第一个响应者。

如果接收者不能成为第一响应者或当前第一响应者不能辞职,则对becomeFirstResponder的调用将失败并返回NO

无论什么已经是第一响应者可以拒绝放弃第一响应者状态。 在这种情况下,您的UITextField将不会成为第一个响应者。 因此,您应确保已经是第一响应者的任何内容都不会拒绝放弃该状态。

编辑:

在提交到app store时,您不希望将其留在应用中,但这里有一些使用私有API来确定当前第一响应者的代码:

 UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow]; UIView *firstResponder = [keyWindow performSelector:@selector(firstResponder)]; 

您可以使用它来查看第一响应者是什么,这可以帮助您找出无法让它辞职的原因,如果这确实是问题。