touchesbegan用于解除scrollview下的键盘textview无法正常工作

时间:2016-07-09 01:41:07

标签: ios swift cocoa-touch uiscrollview uitextfield

我在视图下有一个文本字段,该视图位于视图控制器内的滚动视图下,该视图控制器是导航控制器的视图控制器之一。我想在用户触摸文本字段外时关闭键盘。我尝试使用touchesBegan:,但在滚动视图下它没有触发。我也尝试在滚动视图中禁用用户交互,但没有任何效果。谁能帮助我?

 func dismissKeyboard(txtField:UITextField)
    {
        txtField.resignFirstResponder()

    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        dismissKeyboard(firstNameTxt)
     }  

更改了以下方式以使其正常工作

extension AddEditHireViewController {
    func hideKeyboard()
    {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(
            target: self,
            action: "dismissKeyboardNew")

        self.formView.addGestureRecognizer(tap)

    }

    func dismissKeyboardNew()
    {
         self.formView.endEditing(true)
        // self.dismissKeyboard(self.firstNameTxt)

    } }

2 个答案:

答案 0 :(得分:1)

您可以尝试创建视图控制器的扩展名。这对我来说更顺畅,而且比试图使用.resignFirstResponder()

更麻烦
extension UIViewController
{
    func hideKeyboard()
    {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(
            target: self,
            action: #selector(UIViewController.dismissKeyboard))

        view.addGestureRecognizer(tap)
    }

    func dismissKeyboard()
    {
        view.endEditing(true)
    }
}

self.hideKeyboard()

中致电viewDidLoad

答案 1 :(得分:1)

虽然Matthew Bradshaw给出的解决方案也有效,但如果用户滚动则不会解除键盘。如果您希望它这样做,另一个解决方案是子类UIScrollView。然后,您可以覆盖此子类中的touchesBegan方法,然后相应地结束编辑。

class DismissableScrollView: UIScrollView {
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        endEditing(false)
    }
}

完成此操作后,只需将现有的UIScrollView类更改为DismissableScrollView,或者如果您已经将UIScrollView子类化,则可以将其添加到该子类中