如何使UITextView"完成"按钮resignFirstResponder?

Jas*_*son 23 iphone interface-builder uitextview iboutlet ios

当用户点击"完成"时,我正在尝试让我的可编辑UITextView辞职键盘(resignFirstResponder).使用a UITextField,我已经能够使用以下代码执行此操作:

- (IBAction)doneEditing:(id)sender {
    [sender resignFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)

...然后将其附加到UITextFieldInterface Builder中的相关内容到"退出时已结束"操作.

然而,有了一个UITextView,我似乎无法访问"退出时结束"动作.有关如何实现这一目标的任何建议?

Ric*_*erg 88

接受的答案对我不起作用.相反,应该像这样调用以下委托方法:

- (BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if([text isEqualToString:@"\n"]){
        [textView resignFirstResponder];
        return NO;
    }else{
        return YES;
    }
}
Run Code Online (Sandbox Code Playgroud)

将其粘贴到您指定为UITextView委托的类中,它将起作用.

  • 这个答案将忽略使用UITextView的全部原因,其中用户想要添加多行,这是返回按钮在UITextView的上下文中所做的. (10认同)
  • 令人惊讶的是这在2015年仍然是个问题 (5认同)
  • @zachzurn - 我不认为这适用于这个用例,它希望在键盘上有多行文本和完成按钮.对我来说很明显,将完成按钮用作返回按钮会改变可用性. (3认同)

Jor*_*dan 13

新的答案

在你的View上,你有一个连接到下面的IBAction的UIBarButton("Done"):

- (IBAction)doneEditing:(id)sender {
    [textView resignFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)

textView是您的.h文件中定义的textView插座,并连接在Storyboard或.xib文件中.像这样:

@property (retain, nonatomic) IBOutlet UITextView *textView;
Run Code Online (Sandbox Code Playgroud)

老答案

检查以下内容:

  1. 是否在.h中指定了UITextViewDelegate
  2. 为uitextview实现委托方法:textViewShouldEndEditing,返回YES
  3. 确保你的.m(控制器)是IB中uitextview的代表
  4. resignFirstResponder现在应该可以工作了.

  • 当用户按下一个UITextView中的返回/完成按钮,检查在shouldChangeTextInRange回车textViewShouldEndEditing不叫是唯一的出路 (2认同)