触摸UITextField外的任何地方时如何解除键盘(在swift中)?

Whi*_*Hat 60 uitextfield uikeyboard ios swift

我正在开发一个具有UIViewController的项目,在视图控制器上,在scrollview上有一个UIScrollView和一个UITextField.像这样: 我正试图解除键盘并在文本字段中键入一些文本后隐藏它并点击文本字段外的任何位置.我试过以下代码:

override func viewDidLoad() {
    super.viewDidLoad()
    self.textField.delegate = self;
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    self.view.endEditing(true)
}
Run Code Online (Sandbox Code Playgroud)

当我在滚动视图外面点击时它适用于我,但当我点击滚动视图时没有任何反应,键盘也不会隐藏.

点击文本域外的任何位置时有没有办法解除键盘?谢谢

Mat*_*haw 104

编辑为Swift 4

编辑:已添加@objc.虽然这不是性能的最佳选择,但在此有一个实例不应该导致太多问题,直到有更好的解决方案.

当需要与GestureRecognizer背后的项目进行交互时编辑修复.

编辑:谢谢@Rao指出这一点.补充说tap.cancelsTouchesInView = false.

这应该可以帮助你拥有多个UITextViewUITextField

创建视图控制器的扩展.这对我来说更顺畅,并且比试图使用更轻松.resignFirstResponder()

extension UIViewController
{
    func setupToHideKeyboardOnTapOnView()
    {
        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)

self.setupToHideKeyboardOnTapOnView()在viewDidLoad中调用

  • 警告:如果您在同一视图上说了一个tableView,此代码将阻止单元格点击,并且您的didSelectRow将不会触发.为了避免这种情况,你需要在`addGestureRecognizer之前添加`tap.cancelsTouchesInView = false`. (6认同)
  • 工作精美,优雅.这应该是答案 (3认同)

iAn*_*rag 58

试试这个,经过测试和工作:

适用于Swift 3.0/4.0

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}
Run Code Online (Sandbox Code Playgroud)

对于老年人斯威夫特

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) {
    self.view.endEditing(true)
}
Run Code Online (Sandbox Code Playgroud)

  • 当点击UIScrollView时,这对我不起作用 (9认同)
  • 这不适用于`UITableView`. (3认同)
  • 请注意,这已更改为在Swift 2中覆盖func touchesBegan(触摸:Set <UITouch>,withEvent事件:UIEvent?) (2认同)

Gia*_*ang 17

迅捷3

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
}
Run Code Online (Sandbox Code Playgroud)


小智 13

在这种情况下,有UITapGesture作为选择之一.为了以防万一,我尝试创建示例代码.像这样,

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var scrollView: UIScrollView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let tapGesture = UITapGestureRecognizer(target: self, action: "tap:")
        view.addGestureRecognizer(tapGesture)
    }

    func tap(gesture: UITapGestureRecognizer) {
        textField.resignFirstResponder()
    }
}
Run Code Online (Sandbox Code Playgroud)


Dev*_*t10 11

适用于ScrollView的Swift 3工作解决方案

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var scrollView: UIScrollView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // The next line is the crucial part
        // The action is where Swift 3 varies from previous versions
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tap(gesture:)))
        self.view.addGestureRecognizer(tapGesture)
    }

    func tap(gesture: UITapGestureRecognizer) {
        textField.resignFirstResponder()
    }
}
Run Code Online (Sandbox Code Playgroud)

关于我引用和使用的这个问题的另一个问题.接受的答案在Swift 3中不再有效.当前选择的答案应该是以下答案.


Vas*_*huk 5

细节

xCode 8.2.1,Swift 3

任务

设置UITapGestureRecognizer以查看UIViewController,它将关闭键盘并使此功能成为UIView的Bool属性.

复杂的实现,但用法是一行

TapGestureRecognizer类

let gesture = UITapGestureRecognizer(target: tableView, action: #selector(UITextView.endEditing(_:)))
tableView.addGestureRecognizer(gesture)
Run Code Online (Sandbox Code Playgroud)

扩展UIView

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let textField = UITextField(frame: CGRect(x: 50, y: 50, width: 200, height: 30))
        textField.borderStyle = .roundedRect
        textField.placeholder = "Enter text"
        textField.becomeFirstResponder()
        view.addSubview(textField)
        let gesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:)))
        view.addGestureRecognizer(gesture)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

import UIKit

class TapGestureRecognizer: UITapGestureRecognizer {

    let identifier: String

    init(target: Any?, action: Selector?, identifier: String) {
        self.identifier = identifier
        super.init(target: target, action: action)
    }

    static func == (left: TapGestureRecognizer, right: TapGestureRecognizer) -> Bool {
        return left.identifier == right.identifier
    }
}
Run Code Online (Sandbox Code Playgroud)

完整样本

import UIKit

extension UIView {

    private var hideKeybordOnTapIdentifier: String { return "hideKeybordOnTapIdentifier" }

    private var hideKeybordOnTapGestureRecognizer: TapGestureRecognizer? {
        let hideKeyboardGesture = TapGestureRecognizer(target: self, action: #selector(UIView.hideKeyboard),
                                                       identifier: hideKeybordOnTapIdentifier)
        if let gestureRecognizers = self.gestureRecognizers {
            for gestureRecognizer in gestureRecognizers {
                if let tapGestureRecognizer = gestureRecognizer as? TapGestureRecognizer,
                    tapGestureRecognizer == hideKeyboardGesture {
                    return tapGestureRecognizer
                }
            }
        }
        return nil
    }

    @objc private func hideKeyboard() { endEditing(true) }

    var hideKeyboardOnTap: Bool {
        set {
            let hideKeyboardGesture = TapGestureRecognizer(target: self, action: #selector(hideKeyboard),
                                                           identifier: hideKeybordOnTapIdentifier)
            if let hideKeybordOnTapGestureRecognizer = hideKeybordOnTapGestureRecognizer {
                removeGestureRecognizer(hideKeybordOnTapGestureRecognizer)
                if gestureRecognizers?.count == 0 { gestureRecognizers = nil }
            }
            if newValue { addGestureRecognizer(hideKeyboardGesture) }
        }
        get { return hideKeybordOnTapGestureRecognizer == nil ? false : true }
    }
}
Run Code Online (Sandbox Code Playgroud)


han*_*som 5

看一下这个.

override func viewDidLoad() {
    var tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTap))
    self.view.userInteractionEnabled = true
    self.view.addGestureRecognizer(tapGesture)
}
Run Code Online (Sandbox Code Playgroud)

然后你的点击处理程序是.

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