2010-06-26 114 views
29

我有一个UITextField的视图,它应该在按下返回时隐藏键盘。resignFirstResponder不隐藏textFieldShouldReturn上的键盘

我的功能是这样的:

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

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

+0

你试过没有返回?返回YES可能会导致文本字段运行一些代码,从而使其再次成为第一响应者。 – rickharrison 2010-06-26 22:38:10

+0

是的,我做了,它没有改变。但重点似乎从字段中删除,右侧的(X)清除字段内容不再显示后resignFirstResponder – favo 2010-06-27 07:22:47

+0

我在iPad上遇到同样的问题 – 2010-09-01 20:08:55

回答

49

我看到你有这个iPad标签。你是否正在使用UIModalPresentationFormSheet呈现模态视图?如果是这样,看起来这是FormSheet模式演示文稿的限制(Apple出于某种原因故意使用它,或者它是一个错误)。看到这些其他问题的更多细节:

Modal Dialog Does Not Dismiss Keyboard

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

+0

多数民众赞成正是发生了什么事,谢谢你,我接受你的答案,因为它解释说这是一些苹果的行为/错误 – favo 2011-02-27 15:10:30

+1

哇,我花了一段时间才找到这个答案,它完美的工作。我不知道它与UIModalPresentationFormSheet有关。 – zachzurn 2012-05-03 07:03:52

+5

tony.stack的答案实际上解决了这个问题。 – 2012-08-16 15:37:32

10

如果您正在使用Interface Builder,请查看您的UITextField是否具有与您班级相关联的授权。

- 选择您的UITextField并在Connections中查看是否退出Outlets-> delegate中的一个连接。如果没有,请与您的File's Owner Class联系。

这需要与您的文件所有者类关联。这个代表告诉在哪里搜索一个方法。如果您正在重写某个方法,则需要告知该对象将在何处搜索该方法。

+0

响应者被正确调用,它不是委托的问题。谢谢你尝试:-) – favo 2010-08-14 16:21:15

3

我遇到了同样的问题。我意识到在将委托连接到Interface Builder中的文件所有者后,我忽略了保存在Interface Builder中。一旦我保存,我重新编译和键盘在返回时消失。

0

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

2

您是否记得实施UITextFieldDelegate协议?

+0

如果你实现了UITextFieldDelegate协议,你可以在无意中导致这种行为,如果你做文本验证。如果您的验证代码在文本无效时从textFieldShouldEndEditing返回false,则该字段不能放弃它的firstResponder状态,并且键盘将保留在下一个视图中的屏幕上。更多细节在http://stackoverflow.com/questions/8379205/uitextfields-keyboard-wont-dismiss-no-really/37082876#37082876 – 2016-05-06 23:44:02

4

为了应对由布兰登提到的问题,可以尝试关闭并重新开启模式视图控制器,只要你仍然有参考它。

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

(其中“自我”应该是你最初用来打开模态视图控制器控制器)

33

有这允许您隐藏键盘呈现模态对话框时有帮助的方法:

- (BOOL)disablesAutomaticKeyboardDismissal { return NO; } 

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

我希望这可以帮助别人!

+1

这个行为在Apples部分是有意的。阅读disablesAutomaticKeyboardDismissal的文档。谢谢托尼,这对我有很大的帮助! – 2012-08-16 15:36:54

+1

这个解决方案很好。如果您正在寻找修补程序,请尝试。为我工作。 – Sparklellama 2012-11-20 22:43:44

+0

你把这个代码放在哪里?我的文本字段在tableviewcell中。 – 2012-12-20 20:26:18

0

最简单的方法是:

  1. 转到您的用户界面生成器,

  2. 选择UITextField和“控制,拖动”到“详细信息视图控制器,详细介绍”和释放。

  3. 窗口会弹出。然后在“Outlets”下选择“Delegate”。

就是这样。它为我工作。

7

这个解决方案在上述任何一种情况下都适用。在呼叫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]; 

+2

我不喜欢它,但这对我有用 – MCR 2013-01-14 19:43:34

+0

键盘动画不见了(就像我的动画一样),但是,这是唯一适用于我的解决方案 – Kalle 2014-12-04 06:01:48

3

的Xcode 4.5.1

只需点击控制,然后在文本字段拖动并释放.H文件

控制键+拖动

然后在弹出菜单中选择

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

然后点击连接按钮

0

如果你是在UIModalPresentationFormSheet就叫

- (BOOL)disablesAutomaticKeyboardDismissal 
{ 
    return NO; 
} 
+1

我已经在近一年前给出了答案 - 仅供参考。:) – 2014-08-04 13:51:03

1

我看了一下这个问题,在屏幕键盘拒绝当你调用resignFirstResponder隐藏这么多的文章,但没有任何建议为我工作。

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

enter image description here

我大概浪费了一整天与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... 
} 

简单,不是吗!

令人惊讶的是,这种解决方法甚至适用于UIViewControllers,它们出现在模式样式中。

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

+0

请帮助我也一直在这一整天挣扎!我已经做了你所说的一切,还有什么可能在你的应用程序中有所不同,我可以在我的程序中改变它? – 4GetFullOf 2014-04-22 22:10:04

+0

你的按钮在哪里? – fatuhoku 2014-05-07 13:48:07

+0

我的UIButton显示在上面的屏幕截图中(显示日期/时间)。当用户点击这个时,我想让onscren键盘消失,并出现一个弹出窗口,他们可以选择一个日期。 – 2014-05-09 08:46:37

0

雨燕3.0:

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

雨燕3.0

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { 

    if textField == addressTextField { 
     textField.resignFirstResponder() 

     return false 
    } 

    return true 
}