24

当用户点击“完成”时,我试图让我的可编辑UITextView退出键盘 ( )。resignFirstResponder使用 a UITextField,我已经能够使用以下代码执行此操作:

- (IBAction)doneEditing:(id)sender {
    [sender resignFirstResponder];
}

...然后将其附加到UITextFieldInterface Builder 中的相关操作“Did End on Exit”。

但是,使用UITextView,我似乎无法访问“退出时结束”操作。关于如何实现这一点的任何建议?

4

4 回答 4

91

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

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

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

于 2011-09-15T15:26:56.327 回答
13

新答案

在您的视图上,您​​将有一个连接到以下 IBAction 的 UIBarButton(“完成”):

- (IBAction)doneEditing:(id)sender {
    [textView resignFirstResponder];
}

其中 textView 是在 .h 文件中定义并在 Storyboard 或 .xib 文件中连接的 textView 出口。像这样:

@property (retain, nonatomic) IBOutlet UITextView *textView;

旧答案

检查以下内容:

  1. .h 中是否指定了 UITextViewDelegate
  2. 实现uitextview的委托方法:textViewShouldEndEditing,返回YES
  3. 确保您的 .m(控制器)是 IB 中 uitextview 的代表
  4. resignFirstResponder 现在应该可以工作了。
于 2010-10-20T10:46:50.823 回答
3

您可以UITextViewDelegate在 Swift 4 中实现并等待“\n”:

    myTextView.delegate = self

// ...

extension MyViewController : UITextViewDelegate {

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if text == "\n" {
            textView.resignFirstResponder()
            return false
        }

        return true
    }
}
于 2018-04-23T13:36:59.787 回答
-5

要让完成按钮关闭键盘,resignFirstResponder您必须实现委托方法。

  1. 在您的 .h 中实现 UITextFieldDelegate

    @interface YourViewController : UIViewController <UITextFieldDelegate>
    
  2. 然后在你的 .m 中实现 textFieldShouldReturn

    -(BOOL) textFieldShouldReturn:(UITextField *)textField
    {
    [textField resignFirstResponder];
    return YES;
    }
    
  3. 不要忘记将 UITextField 的委托链接到文件的所有者(非常重要)

于 2012-06-29T15:17:40.537 回答