【问题标题】:Why UITextField becomeFirstResponder returns NO?为什么 UITextField becomeFirstResponder 返回 NO?
【发布时间】:2014-02-05 17:40:25
【问题描述】:

这是我的代码:

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!!

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

【问题讨论】:

    标签: ios objective-c uitextfield becomefirstresponder


    【解决方案1】:

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

    【讨论】:

    • 当文本字段从视图/窗口层次结构中短暂移除同时成为第一响应者(例如,重新加载包含该文本字段的 UITableView 或 UICollectionView)时,也会发生这种情况。
    【解决方案2】:

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

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

    【讨论】:

    • 另外,如果 isEnabled == false,UITextField 将拒绝显示键盘
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 我怎样才能知道当前的第一响应者是什么?我单击一个按钮以访问我使用在“内部修饰”期间调用的 IBAction 发布的代码,所以我不知道会出现什么问题,除非 UIButton 不会退出。
    • 您必须浏览所有视图并手动询问他们是否是第一响应者。你不想那样做。
    • 我还有其他选择吗?
    • 也许如果你告诉我们更多关于你的观点 heirachy 我可以提出其他建议。
    • 谢谢,这解决了我的问题。值得注意的是,在我的情况下,带有textFieldShouldEndEditing = NO 的文本字段位于 another 视图控制器中。
    【解决方案4】:

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

    编辑:

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

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

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

    【讨论】:

    • 我怎样才能知道当前的第一响应者是什么?我单击一个按钮以访问我使用在“内部修饰”期间调用的 IBAction 发布的代码,所以我不知道会出现什么问题,除非 UIButton 不会退出。
    • 我目前遇到了这个问题,而且它已经成为一个太大的障碍,所以我会推迟它。但这看起来是一个非常好的线索,但是 firstResponder 返回了nil!在下一行代码中,一个 textField 拒绝成为第一响应者。我希望我可以进入代码...
    【解决方案5】:

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

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

    【讨论】:

    • 我怎样才能知道当前的第一响应者是什么?我单击一个按钮以访问我使用在“内部修饰”期间调用的 IBAction 发布的代码,所以我不知道会出现什么问题,除非 UIButton 不会退出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多