Swift 从第一响应者那里退出 TextView

Swift resigning TextView from first responder

我的 ViewController 中有一个 TextField 和一个 TextView。 ViewController 遵循 UITextFieldDelegate 和 UITextViewDelegate 及其委托方法。

我想在单击 return 按钮时让 TextField 或 TextView 不再是第一响应者。 我实现了 func textFieldShouldReturn(_ textField: UITextField) -> Bool func textFieldDidEndEditing(_ textField: UITextField) func textViewShouldReturn(_ textView: UITextView) -> Bool func textViewDidEndEditing(_ textView: UITextView) 并且在相应的 ShouldReturn 方法中有 textField.resignFirstResponder() + textView.resignFirstResponder()

当我点击return按钮时,TextField退出成功,键盘隐藏起来;对于 TextView,return 按钮只是向 TextView 添加一个新行; textViewShouldReturn(_:) 根本没有被调用。

有人可以解释一下 textFieldShouldReturn(_:)textViewShouldReturn(_:) 之间的区别吗?我怎样才能让 TextView 不再是第一响应者?

谢谢

import UIKit

class DetailViewController: UIViewController, UITextViewDelegate, UITextFieldDelegate {

@IBOutlet weak var date: UITextField!
@IBOutlet weak var noteText: UITextView!

override func viewDidLoad() {
    super.viewDidLoad()

    date.delegate = self
    noteText.delegate = self
}


//MARK: UITextViewDelegate

func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
    // Hide the keyboard.
    textView.resignFirstResponder()
    return true
}


func textViewDidEndEditing(_ textView: UITextView) {
}

func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
    // Hide the keyboard.
    textField.resignFirstResponder()
    return true
}


func textFieldDidEndEditing(_ textField: UITextField) {
}

}

有一个技巧可以让textview退出。

extension ViewController: UITextViewDelegate {
    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {

        if text == "\n" {
            textView.resignFirstResponder()
            return false
        }
        return true
    }
}

确保将您的 ViewController 设置为文本视图的委托

更好的方法是在 textview 键盘上添加工具栏以退出键盘,因为用户可能想要添加新行,这样功能应该保持不变。

How to add done button on keyboard on top of keyboard in IOS?