按下完成键后隐藏键盘-Swift

时间:2019-01-06 15:41:08

标签: swift uitextfield

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

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
    }

}

1 个答案:

答案 0 :(得分:0)

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

我看到的第一个问题是您的视图控制器未实现文本视图的委托协议,请对其进行更改: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委托方法关闭键盘
func textFieldShouldReturn(textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
}