resignFirstResponder没有隐藏textFieldShouldReturn上的键盘

时间:2010-06-26 17:33:24

标签: xcode ipad ios4 keyboard

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

我的功能是:

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

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

14 个答案:

答案 0 :(得分:49)

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

Modal Dialog Does Not Dismiss Keyboard

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

答案 1 :(得分:33)

这种有用的方法允许您在演示模态对话框时关闭键盘:

 - (BOOL)disablesAutomaticKeyboardDismissal { return NO; }

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

我希望这有助于某人!

答案 2 :(得分:10)

如果您使用的是Interface Builder,请查看您的UITextField是否已将委托链接到您的班级。

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

这需要与您的文件所有者类链接。该委托告诉在哪里搜索方法。如果你要覆盖一个方法,你需要告诉对象将在哪里搜索它。

答案 3 :(得分: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];

答案 4 :(得分:4)

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

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

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

答案 5 :(得分:3)

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

答案 6 :(得分:3)

xcode 4.5.1

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

控制键+拖动

然后在弹出菜单中选择

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

然后点击连接按钮

答案 7 :(得分:2)

您是否记得实施UITextFieldDelegate协议?

答案 8 :(得分: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...
}

简单,不是吗!

令人惊讶的是,此解决方法甚至适用于以{strong>模态样式显示的UIViewControllers

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

最简单的方法是:

  1. 转到您的用户界面构建器

  2. 选择UITextField并将“Control-Drag”选择为“Detail View Controller-Detail”并发布。

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

  4. 就是这样。它对我有用。

答案 11 :(得分:0)

如果您在UIModalPresentationFormSheet中,只需致电

- (BOOL)disablesAutomaticKeyboardDismissal
{
    return NO;
}

答案 12 :(得分:0)

Swift 3.0:

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

答案 13 :(得分:0)

Swift 3.0

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

    if textField == addressTextField {
        textField.resignFirstResponder()

        return false
    }

    return true
}