resignFirstResponder 没有在 textFieldShouldReturn 上隐藏键盘

Posted

技术标签:

【中文标题】resignFirstResponder 没有在 textFieldShouldReturn 上隐藏键盘【英文标题】:resignFirstResponder not hiding keyboard on textFieldShouldReturn 【发布时间】:2010-06-26 17:33:24 【问题描述】:

我有一个 UITextField 视图,当按下返回时它应该隐藏键盘。

我的功能是这样的:

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
 if ( textField == userPassword ) 
  [textField resignFirstResponder];
 
 return YES;

通常键盘应该是隐藏的,但它会停留在屏幕上。 resignFirstResponder 被正确调用。我错过了什么?

【问题讨论】:

你试过返回NO吗?返回 YES 可能会导致文本字段运行一些代码,使其再次成为第一响应者。 是的,我做到了,它没有任何改变。然而,焦点似乎已从字段中移除,右侧用于清除字段内容的 (X) 在 resignFirstResponder 后不再显示 我在 iPad 上遇到了同样的问题 同样的问题。有没有想过? 还没有,我还在找:( 【参考方案1】:

我看到你在这上面有 iPad 标签。您是否碰巧使用 UIModalPresentationFormSheet 呈现模态视图?如果是这样,看起来这是 FormSheet 模式表示的限制(Apple 出于某种原因故意这样做,或者它是一个错误)。有关详细信息,请参阅这些其他问题:

Modal Dialog Does Not Dismiss Keyboard

Modal View Controller with keyboard on landscape iPad changes location when dismissed

【讨论】:

这正是发生的事情,谢谢,我接受了你的回答,因为它解释了这是苹果的一些行为/错误 哇,我花了一段时间才找到这个答案,而且效果很好。我不知道它与 UIModalPresentationFormSheet 相关。 tony.stack 的回答实际上解决了这个问题。 我通过在主队列中执行resignFirstResponder 解决了这个问题。希望这对任何人都有帮助【参考方案2】:

有一个有用的方法可以让您在显示模态对话框时关闭键盘:

 - (BOOL)disablesAutomaticKeyboardDismissal  return NO; 

这将覆盖 Apple 设置的模式对话框的默认行为,并允许您关闭键盘。它在 UIViewController 类中。

我希望这对某人有帮助!

【讨论】:

这种行为是 Apple 故意的。阅读有关 disablesAutomaticKeyboardDismissal 的文档。谢谢托尼,这帮了大忙! 这个解决方案很好。如果您正在寻找修复程序,请尝试一下。为我工作。 把它放在为你的键盘调用 UITextView 或 Text Thingy 的类中。 这就是答案!期待已久的谜团解开了。 我必须继承 UINavigationController 并在其中添加此方法。这是因为我的 Modal 视图控制器 Root 是 NavigationController。【参考方案3】:

如果您使用的是 Interface Builder,请查看您的 UITextField 是否具有与您的类相关联的委托。

-选择您的 UITextField 并在您的 Connections 中查看是否退出 Outlets->delegate 中的一个连接。如果没有,请与您的文件所有者类联系。

这需要与文件的所有者类相关联。这个委托告诉在哪里搜索一个方法。如果您要覆盖一个方法,则需要说明该对象将在何处搜索该方法。

【讨论】:

响应者被正确调用,它不是委托的问题。感谢您尝试:-)【参考方案4】:

在上述方法均无效后,此解决方案对我有用。在调用 resignFirstResponder 后,我添加了一个模态视图并将其删除。



    [myTextField resignFirstResponder];
    UIViewController *dummyController = [[UIViewController alloc] init];
    UIView *dummy = [[UIView alloc] initWithFrame:CGRectMake(-1, -1,1,1)];
    [dummyController setView:dummy];
    [self presentModalViewController:dummyController animated:NO];
    [dummyController dismissModalViewControllerAnimated:NO];

【讨论】:

键盘动画消失了(我的动画也消失了)但是是的,这是唯一适合我的解决方案。【参考方案5】:

要处理 Brandon 提到的错误,只要您仍然有对它的引用,您可以尝试关闭并重新打开您的模态视图控制器。

[textField resignFirstResponder];
[self dismissModalViewControllerAnimated:NO];
[self presentModalViewController:yourModalViewControllerReference animated:NO];

(其中“self”应该是您最初打开模态视图控制器时使用的控制器)

【讨论】:

【参考方案6】:

我遇到了同样的问题。我意识到在 Interface Builder 中将委托连接到 File's Owner 后,我忽略了在 Interface Builder 中保存。保存后,我重新编译,按回车时键盘正确消失。

【讨论】:

【参考方案7】:

xcode 4.5.1

只需单击控件,然后在文本字段上拖放 .h 文件

控制键+拖动

然后在弹出的菜单中选择

connection=acton;
name= any name;
type=id;
event=did end on exit;
arguments=sender;

然后点击连接按钮

【讨论】:

【参考方案8】:

您还记得实现UITextFieldDelegate 协议吗?

【讨论】:

如果你实现 UITextFieldDelegate 协议,如果你进行文本验证,你可能会无意中导致这种行为。如果您的验证代码在文本无效时从 textFieldShouldEndEditing 返回 false,则该字段无法放弃其 firstResponder 状态,并且键盘将在下一个视图中保留在屏幕上。更多详情***.com/questions/8379205/…【参考方案9】:

我已经阅读了很多关于这个问题的文章,当您拨打resignFirstResponder 时屏幕键盘拒绝隐藏,但没有任何建议对我有用。

我正在使用 XCode 5 (ios 7) 并且有一个 iPhone 屏幕,其中包含一些需要屏幕键盘的控件,但是如果用户单击 UIButton,那么我希望键盘消失。

我可能浪费了一整天的时间尝试 resignFirstResponder 并添加 disablesAutomaticKeyboardDismissal 函数以返回 NO,但没有任何效果。一旦屏幕键盘出现,我就再也无法让它消失了。

但后来我的脑电波很小(因为我只有一个小脑)。

现在,当用户点击我的UIButton 时,我只需禁用UITextFieldUITextView 控件。

- (IBAction)btnDate_Tapped:(id)sender 
    //  The user has clicked on the "Date" button.
    self.tbClientName.enabled = NO;
    self.tbComments.editable = NO;

突然间,该应用发现它没有需要屏幕键盘的可编辑文本字段,并且它巧妙地将键盘滑出视线。

(松了口气。)

我的UIButton 实际上会出现一个弹出对话框。当用户关闭弹出窗口时,我重新启用这两个控件,因此如果用户点击其中一个,键盘将再次出现。

-(void)popoverControllerDidDismissPopover:(UIPopoverController *) popoverController 
    //  The user has closed our popup dialog.
    //  We need to make our UITextField and UITextView editable again.
    self.tbClientName.enabled = YES;
    self.tbComments.editable = YES;
    ... etc...

很简单,不是吗!

令人惊讶的是,这种解决方法甚至适用于以 Modal 样式出现的UIViewControllers

我希望这可以帮助其他 XCode 受害者。

【讨论】:

请帮助我已经为此苦苦挣扎了一整天!我已经完成了您所说的所有操作,您的应用程序中还有什么可能会有所不同,我可以在我的应用程序中进行更改吗? 我的 UIButton 显示在上面的屏幕截图中(显示日期/时间)。当用户点击它时,我希望屏幕键盘消失,并出现一个弹出窗口,他们可以在其中选择一个日期。【参考方案10】:

根据您的评论,看起来焦点已经转移,那么我认为可能发生的情况是键盘为下一个文本输入字段保持打开状态。如果您的返回键是“Next”键,则为 textFieldShouldReturn: 返回 YES 将使下一个 textField 成为第一响应者,并保持键盘可见。

【讨论】:

【参考方案11】:

最简单的方法是:

    转到您的用户界面构建器,

    选择UITextField 和“Control-Drag”到“Detail View Controller-Detail”并释放。

    将弹出该窗口。然后在“Outlets”下选择“Delegate”。

就是这样。它对我有用。

【讨论】:

【参考方案12】:

如果您在 UIModalPresentationFormSheet 中,只需调用

- (BOOL)disablesAutomaticKeyboardDismissal

    return NO;

【讨论】:

我已经在差不多一年前给出了这个答案——仅供参考。 :)【参考方案13】:

斯威夫特 3.0:

override var disablesAutomaticKeyboardDismissal: Bool 
    get
        return false
    
    set 
        self.disablesAutomaticKeyboardDismissal = false
    

【讨论】:

【参考方案14】:

Swift 3.0

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool 

    if textField == addressTextField 
        textField.resignFirstResponder()

        return false
    

    return true

【讨论】:

以上是关于resignFirstResponder 没有在 textFieldShouldReturn 上隐藏键盘的主要内容,如果未能解决你的问题,请参考以下文章

resignFirstResponder 没有按预期工作

没有看到 UIScrollView 上的 UITextField 时 resignFirstResponder

resignFirstResponder 没有按预期工作。每次按键时键盘都会弹出,而不是仅返回

resignFirstResponder 不关闭键盘

为啥必须在主队列上异步调用 resignFirstResponder() 来关闭键盘

UITextField - resignFirstResponder 查询