如果我们在 Swift 中触摸 UITextView 之外的其他区域,如何关闭键盘

Ale*_*289 3 uitableview uitextview ios uitapgesturerecognizer swift

在静态表视图中有 UITextView ,如果用户触摸textView 之外的其他区域,我想移除键盘

通常我可以用这行代码来移除键盘,但我不知道为什么,在 textview 中添加占位符后,它不起作用。我怀疑是因为它在静态表视图中

extension CheckinDetailTVC {

    // to remove keyboard if we touch other area
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(false)
    }

}
Run Code Online (Sandbox Code Playgroud)

我也在 stackoverflow 中尝试了另一种解决方案,但没有人在我身上工作,比如添加手势识别器

override func viewDidLoad() {
    super.viewDidLoad()
    let tapGestureReconizer = UITapGestureRecognizer(target: self, action: "tap:")
    view.addGestureRecognizer(tapGestureReconizer)
}

func tap(sender: UITapGestureRecognizer) {
    view.endEditing(true)
}
Run Code Online (Sandbox Code Playgroud)

或在 TextViewDelegate 中添加函数,但它也不起作用

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

这是我的用户界面的屏幕截图

在此处输入图片说明

这是我在视图控制器中使用的简化代码

class CheckinDetailTVC: UITableViewController {


    @IBOutlet weak var noteTextView: UITextView!


    override func viewDidLoad() {
        super.viewDidLoad()

        // to put placeholder for UITextView
        noteTextView.delegate = self
        noteTextView.text = "Write your note in here ..."
        noteTextView.textColor = UIColor.lightGray
        noteTextView.becomeFirstResponder()
        noteTextView.selectedTextRange = noteTextView.textRange(from: noteTextView.beginningOfDocument, to: noteTextView.beginningOfDocument)



    }



}




extension CheckinDetailTVC : UITextViewDelegate {

// add placeholder for textView

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

        let currentText:String = textView.text
        let updatedText = (currentText as NSString).replacingCharacters(in: range, with: text)

        if updatedText.isEmpty {

            textView.text = "Write your note in here ..."
            textView.textColor = UIColor.lightGray

            textView.selectedTextRange = textView.textRange(from: textView.beginningOfDocument, to: textView.beginningOfDocument)

            return false
        }

        else if textView.textColor == UIColor.lightGray && !text.isEmpty {
            textView.text = nil
            textView.textColor = UIColor.black
        }

        return true
    }

    func textViewDidChangeSelection(_ textView: UITextView) {
        if self.view.window != nil {
            if textView.textColor == UIColor.lightGray {
                textView.selectedTextRange = textView.textRange(from: textView.beginningOfDocument, to: textView.beginningOfDocument)
            }
        }
    }

}




extension CheckinDetailTVC {

    // usually i can use this code to remove keyboard if we touch other area
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(false)
    }

}
Run Code Online (Sandbox Code Playgroud)

这里出了什么问题?

Anb*_*hik 9

选项1

在不阻塞 UI 的情况下cancelsTouchesInView 为您的手势添加

let tapGestureReconizer = UITapGestureRecognizer(target: self, action: "tap:")
tapGestureReconizer.cancelsTouchesInView = false
view.addGestureRecognizer(tapGestureReconizer)
Run Code Online (Sandbox Code Playgroud)

选项 2

else 以多种方式处理辞职

func tap(sender: UITapGestureRecognizer) {
 view.endEditing(true)
 // or use 
 noteTextView.resignFirstResponder()
 // or use
 view.super().endEditing(true)
 // or use
 view.keyboardDismissMode = .onDrag
}
Run Code Online (Sandbox Code Playgroud)


Osc*_*nez 6

正如他们上面提到的,使用UITapGestureRecognizer可以解决问题

extension UIViewController {

    @objc func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action:    #selector(UIViewController.dismissKeyboard))
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard() {
        view.endEditing(true)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在 viewDidLoad

 override func viewDidLoad() {
        super.viewDidLoad()
        self.hideKeyboardWhenTappedAround()
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以添加手势以通过触摸或滑动来关闭键盘。创建一个触摸手势对象并添加一个动作方法,使视图退出第一响应者的状态:

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(DismissKeyboard))
view.addGestureRecognizer(tap)

@objc func DismissKeyboard(){
//Causes the view to resign from the status of first responder.
view.endEditing(true)
}
Run Code Online (Sandbox Code Playgroud)