【问题标题】:touchesbegan for dismissing keyboard textview under scrollview not workingtouchesbegan 用于在滚动视图下关闭键盘文本视图不起作用
【发布时间】:2016-11-11 15:49:53
【问题描述】:

我在视图下有一个文本字段,该文本字段位于视图控制器内的滚动视图下,该视图控制器是导航控制器的视图控制器之一。当用户在文本字段之外触摸时,我想关闭键盘。我尝试使用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)

    } }

【问题讨论】:

    标签: ios swift cocoa-touch uiscrollview uitextfield


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢您提供的信息,您能否详细解释一下“如果用户滚动,它不会关闭键盘”。正在测试它,但无法获得您所说的场景
    • @Arav 据我所知,UITapGestureRecognisers 在用户平移时被取消。然而,情况可能并非如此。
    • 非常感谢您提供的信息。用dismissablescrollview 测试。当我平移时,它不会关闭键盘。我需要覆盖其他方法吗?
    【解决方案2】:

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

    extension UIViewController
    {
        func hideKeyboard()
        {
            let tap: UITapGestureRecognizer = UITapGestureRecognizer(
                target: self,
                action: #selector(UIViewController.dismissKeyboard))
    
            view.addGestureRecognizer(tap)
        }
    
        func dismissKeyboard()
        {
            view.endEditing(true)
        }
    }
    

    viewDidLoad中拨打self.hideKeyboard()

    【讨论】:

    • 非常感谢 Mathew,它可以正常工作。但是当我尝试使用您的操作选择器时,我的应用程序崩溃了,因此我需要更改选择器部分以使其正常工作粘贴了问题部分中的更改
    • 粘贴了我在问题部分所做的更改。如果我使用这种方式选择器(UIViewController.dismissKeyboard)它不起作用。不知道为什么会这样
    • @Arav 只是提醒一下,在 Swift 2 中不推荐使用字符串作为选择器,该功能将在 Swift 3 中完全删除。
    • @Arav 我不确定它为什么会崩溃。错误信息是什么?
    • 它在 AppDelegate 类中崩溃。错误消息无法找到选择器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2017-07-09
    相关资源
    最近更新 更多