Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么UITextField成为第一响应者返回否?_Ios_Objective C_Uitextfield_Becomefirstresponder - Fatal编程技术网

Ios 为什么UITextField成为第一响应者返回否?

Ios 为什么UITextField成为第一响应者返回否?,ios,objective-c,uitextfield,becomefirstresponder,Ios,Objective C,Uitextfield,Becomefirstresponder,这是我的代码: while (true) { if ([identificationField becomeFirstResponder]) { NSLog(@"finally!"); break; } else{ if ([identificationField canBecomeFirstResponder]) { NSLog(@"can"); } else{

这是我的代码:

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!!
2014-02-05 11:33:54.253贮存试验[22488:70b]罐
2014-02-05 11:33:54.254存储测试[22488:70b]
2014-02-05 11:33:54.254存储测试[22488:70b]dadgum!!

有人知道为什么会这样吗?正如您所见,文本字段可以成为第一响应者,但它不会。您可能有另一个元素正在阻止它。需要更多地了解您的项目,才能真正回答确切的问题

但是,这里有一个可能的情况,即您有另一个包含委托方法的textField

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

这意味着它不会放弃第一响应者。

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


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

第一响应者可以拒绝放弃第一响应者状态。在这种情况下,您的
UITextField
不会成为第一响应者。因此,你应该确保第一反应者不会拒绝放弃这种状态

编辑:

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

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

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

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

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


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

我如何才能找到当前第一响应者是什么?我点击一个按钮进入我使用iAction发布的代码,iAction在“内部润色”期间被调用,因此我不知道会出现什么问题,除非UIButton不会辞职。我如何才能找到当前的第一响应者?我点击一个按钮进入我使用iAction发布的代码,iAction在“内部润色”过程中被调用,因此我不知道会出现什么问题,除非UIButton不辞职。我目前有这个问题,而且它已经成为一个太多的拦截器,所以我将推迟它。。但这看起来是一个非常好的线索,然而第一响应者返回了
nil
!在下一行代码中,一个textField拒绝成为第一响应者。我希望我能进入代码…我怎样才能知道当前的第一响应者是什么?我点击一个按钮进入我使用iAction发布的代码,iAction在“内部润色”过程中被调用,因此我不知道会出现什么问题,除非UIButton不辞职。你必须浏览所有视图并手动询问他们是否是第一响应者。你不想这么做。我还有其他选择吗?也许如果你告诉我们更多关于你的观点,我可以提出其他建议。谢谢,这解决了我的问题。值得注意的是,在我的例子中,带有
textfield shouldenediting=NO
的textfield位于另一个视图控制器中。当textfield在成为第一响应者时从视图/窗口层次结构中短暂删除时,也会发生这种情况(例如,重新加载保存该textfield的
UITableView
UICollectionView
)。此外,如果isEnabled==false,UITextField将拒绝显示键盘