在IB的库中,介绍告诉我们,当按下返回键时,UITextView的键盘将消失。但实际上返回键只能作为'\n'

我可以添加一个按钮,并使用[txtView resignFirstResponder]隐藏键盘。

但是有没有办法为键盘中的返回键添加动作,这样我就不需要添加UIButton了?


当前回答

类似于使用UITextViewDelegate的其他答案,但一个更新的swift接口isNewline将是:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if let character = text.first, character.isNewline {
        textView.resignFirstResponder()
        return false
    }
    return true
}

其他回答

斯威夫特

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

好的。每个人都用技巧给出了答案,但我认为实现这一点的正确方法是

将以下操作连接到接口生成器中的“Did End On Exit”事件。 (右键单击TextField并从“Did end on exit”中cntrl-drag到以下方法。

-(IBAction)hideTheKeyboard:(id)sender
{
    [self.view endEditing:TRUE];
}

你应该添加UIToolbar到顶部UITextView,而不是使用shouldChangeTextIn

在Swift 4中

let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
        toolbar.barStyle = .default
        toolbar.items = [
            UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
            UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(doneAction))
        ]
        textView.inputAccessoryView = toolbar
@objc func doneAction(){
 self.textView.resignFirstResponder()
}

我知道这个问题已经被回答过很多次了,但下面是我对这个问题的看法。

我发现samvermette和ribeto的回答非常有用,还有maxpower在ribeto的回答中的评论。但这些方法存在一个问题。matt在samvermette的回答中提到的问题是,如果用户想要在其中粘贴带有换行符的东西,键盘将隐藏而不粘贴任何东西。

所以我的方法是上述三种解决方案的混合,只有检查输入的字符串是否为新行,当字符串的长度为1时,我们确保用户是键入而不是粘贴。

以下是我所做的:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    NSRange resultRange = [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:NSBackwardsSearch];
    if ([text length] == 1 && resultRange.location != NSNotFound) {
        [textView resignFirstResponder];
        return NO;
    }

    return YES;
}

UITextView没有任何在用户点击返回键时被调用的方法。如果您希望用户只能添加一行文本,请使用UITextField。按回车键并隐藏UITextView的键盘不符合接口准则。

即使这样,如果你想这样做,实现textView:shouldChangeTextInRange:replacementText:方法的UITextViewDelegate,并在检查替换文本是否\n,隐藏键盘。

也许还有别的办法,但我不知道有什么办法。