如何使UITextView的“完成”按钮resignFirstResponder?

24

我正在尝试让我的可编辑的UITextView在用户点击“完成”时取消键盘(resignFirstResponder)。使用UITextField,我已经能够用以下代码做到这点:

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

... 然后将其附加到Interface Builder中相关的UITextField上,作为“Did End on Exit”操作。

但是,在使用UITextView时,我似乎无法访问“Did End on Exit”操作。有什么建议可以实现这一点吗?

4个回答

91

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

- (BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if([text isEqualToString:@"\n"]){
        [textView resignFirstResponder];
        return NO;
    }else{
        return YES;
    }
}
将这段代码粘贴到您指定为UITextView委托的类中,它就会正常工作。

10
这个答案忽略了使用UITextView的整个原因,用户会想要添加多行文本,而在UITextView中按下返回键就是实现这一目的。 - zachzurn
4
@zachzurn - 我认为这并不适用于本案例,因为用户希望在键盘上有多行文本和一个“完成”按钮。对我来说很明显,让“完成”按钮像回车键一样起作用会降低可用性。 - Rich Lowenberg
如果用户将回车复制粘贴到textView中,这将被触发。 - Albert Renshaw
好观点,阿尔伯特 - 尽管只有当他们粘贴回车符时才会发生这种情况。如果粘贴中有任何其他字符,则不会触发。但值得注意。理论上,如果您担心,可以创建一个自定义的UITextView并覆盖粘贴方法,尽管对我来说可能不值得麻烦。 - Rich Lowenberg
5
2015年了,令人惊讶的是这仍然是个问题。 - Oren
如果你听到“\n”这个词来判断是否应该消除关键字,那么你可能会遇到一个尴尬的情况,即每次输入新行时都会误判为需要消除关键字。 - Chauyan

13

新答案

在您的视图上,您需要一个UIBarButton(“完成”),它连接到以下IBAction:

- (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 应该可以工作了。

2
textViewShouldEndEditing方法在用户按下UITextView上的Return/Done按钮时不会被调用,检查shouldChangeTextInRange中的换行符是唯一的方法。 - valexa

3
你可以在Swift 4中实现UITextViewDelegate并等待"\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
    }
}

-5

要让完成按钮关闭键盘并且 resignFirstResponder,你需要实现一个代理方法。

  1. 在你的.h文件中实现UITextFieldDelegate

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接