如果我们在 Swift 中触摸 UITextView 之外的其他区域,如何关闭键盘
how to Dismiss Keyboard if we touch other area outside UITextView in Swift
我有 UITextView inside static table view,如果用户触摸其他区域 在 textView
之外
通常我可以通过这行代码来删除键盘,但我不知道为什么,在文本视图中添加占位符后,它不起作用。我怀疑是因为它在 table view static
里面
extension CheckinDetailTVC {
// to remove keyboard if we touch other area
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(false)
}
}
我也在 Whosebug 中尝试了另一种解决方案,但没有人适合我,比如添加手势识别器
override func viewDidLoad() {
super.viewDidLoad()
let tapGestureReconizer = UITapGestureRecognizer(target: self, action: "tap:")
view.addGestureRecognizer(tapGestureReconizer)
}
func tap(sender: UITapGestureRecognizer) {
view.endEditing(true)
}
或者在TextViewDelegate中添加功能,但还是不行
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
if text == "\n" {
textView.resignFirstResponder()
}
return true
}
这是我的截图 UI
这是我在视图控制器中使用的简化代码
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)
}
}
这里出了什么问题?
选项 1
不阻塞 UI 添加 cancelsTouchesInView
为了你的手势`
let tapGestureReconizer = UITapGestureRecognizer(target: self, action: "tap:")
tapGestureReconizer.cancelsTouchesInView = false
view.addGestureRecognizer(tapGestureReconizer)
选项 2
否则以多种方式处理辞职
func tap(sender: UITapGestureRecognizer) {
view.endEditing(true)
// or use
noteTextView.resignFirstResponder()
// or use
view.super().endEditing(true)
// or use
view.keyboardDismissMode = .onDrag
}
您可以添加手势以通过触摸或滑动关闭键盘。创建一个触摸手势的对象,并添加一个使视图退出第一响应者状态的动作方法:
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)
}
正如他们上面提到的那样,使用 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)
}
}
然后在 viewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
我有 UITextView inside static table view,如果用户触摸其他区域 在 textView
之外通常我可以通过这行代码来删除键盘,但我不知道为什么,在文本视图中添加占位符后,它不起作用。我怀疑是因为它在 table view static
里面extension CheckinDetailTVC {
// to remove keyboard if we touch other area
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(false)
}
}
我也在 Whosebug 中尝试了另一种解决方案,但没有人适合我,比如添加手势识别器
override func viewDidLoad() {
super.viewDidLoad()
let tapGestureReconizer = UITapGestureRecognizer(target: self, action: "tap:")
view.addGestureRecognizer(tapGestureReconizer)
}
func tap(sender: UITapGestureRecognizer) {
view.endEditing(true)
}
或者在TextViewDelegate中添加功能,但还是不行
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
if text == "\n" {
textView.resignFirstResponder()
}
return true
}
这是我的截图 UI
这是我在视图控制器中使用的简化代码
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)
}
}
这里出了什么问题?
选项 1
不阻塞 UI 添加 cancelsTouchesInView
为了你的手势`
let tapGestureReconizer = UITapGestureRecognizer(target: self, action: "tap:")
tapGestureReconizer.cancelsTouchesInView = false
view.addGestureRecognizer(tapGestureReconizer)
选项 2
否则以多种方式处理辞职
func tap(sender: UITapGestureRecognizer) {
view.endEditing(true)
// or use
noteTextView.resignFirstResponder()
// or use
view.super().endEditing(true)
// or use
view.keyboardDismissMode = .onDrag
}
您可以添加手势以通过触摸或滑动关闭键盘。创建一个触摸手势的对象,并添加一个使视图退出第一响应者状态的动作方法:
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)
}
正如他们上面提到的那样,使用 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)
}
}
然后在 viewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}