按完成键后隐藏键盘 - Swift

Hiding keyboard after hitting the Done key - Swift

所以我正在以编程方式制作一个文本字段。当我按下键盘上的完成键时,光标会转到下一行并且键盘不会消失。我已经包含了人们推荐的所有代码行,以使键盘消失但它没有用。有人可以看看我的代码并建议我需要添加什么吗?我想按下完成键,键盘消失,光标不转到下一行。

import UIKit

class FirstPage: UIViewController {

    let emailText: UITextView = {
        let textView = UITextView()
        let attributedText = NSMutableAttributedString(string: "Email", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 20),NSAttributedString.Key.foregroundColor: UIColor.gray])
        textView.backgroundColor = UIColor.clear
        textView.attributedText = attributedText
        textView.translatesAutoresizingMaskIntoConstraints = false
        textView.textAlignment = .center
        textView.returnKeyType = .done
        textView.resignFirstResponder()
        textView.isScrollEnabled = false
        return textView
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        emailText.delegate = self as? UITextViewDelegate
        view.addSubview(emailText)
        emailText.translatesAutoresizingMaskIntoConstraints = false
        emailText.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
    }

}

关于您的评论,我相信您有关闭键盘的委托方法。

我看到的第一个问题是您的视图控制器没有实现文本视图的委托协议,更改它:Class: Protocol

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

然后像 self

一样设置文本视图的委托
emailText.delegate = self

也让你的文本视图变量lazy(你也可以在惰性变量初始化中分配它的委托)

lazy var emailText: UITextView = {
    let textView = UITextView()
    ...
    textView.delegate = self
    return textView
}()

现在,让我们考虑一下内容。您有 UITextView 用于插入 电子邮件 。由于插入电子邮件一行文本就足够了,因此请使用 UITextField 而不是文本视图。

然后您可以使用文本字段的 textFieldShouldReturn 委托方法在按下 return 键后关闭键盘

func textFieldShouldReturn(textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
}