6

这是我的代码:

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 = <NSArray:
   0xb5cc7b0>; layer = <CALayer: 0xb5c8b40>>

   2014-02-05 11:33:54.254 Store Test[22488:70b] dadgum!!

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

4

5 回答 5

6

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

于 2014-10-18T15:15:54.627 回答
5

如果 A 的财产与我刚刚发现的一样, AUITextField也将拒绝成为第一响应者。在文本字段接受第一响应者状态之前,我必须明确地重新启用用户交互。userInteractionEnabledNO

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

于 2015-03-11T22:13:42.773 回答
2

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

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

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

这意味着它不会辞去第一响应者的职务。

于 2014-02-05T17:47:58.867 回答
1

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

编辑:

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

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

您可以使用它来查看第一响应者是什么,如果这确实是问题,这可能会帮助您找出为什么不能让它辞职。

于 2014-02-05T17:48:56.420 回答
0

调用canBecomeFirstResponder只检查接收者本身是否可以成为第一响应者。

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

于 2014-02-05T17:48:44.303 回答