【问题标题】:Gesture Recognizer Not Called未调用手势识别器
【发布时间】:2015-07-26 16:04:48
【问题描述】:

我设置了一个手势识别器,用于在用户在文本字段外点击时关闭键盘。 DismissKeyboard 函数没有被调用。

我是否设置了错误的观察者或者这是一个不同的问题?另外,这是一个正在被点击的 tableview。

代码摘录

class CommentsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: Selector("keyboardWillShow:"),
            name: UIKeyboardWillShowNotification,
            object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: Selector("keyboardWillHide:"),
            name: UIKeyboardWillHideNotification,
            object: nil)
    }

    func keyboardFrameChanged(notification: NSNotification) {
        println("keyboardFrameChanged")
        let userInfo = notification.userInfo
        let key = UIKeyboardFrameEndUserInfoKey
        if let info = userInfo {
            let frameValue = info[key] as! NSValue
            let _frame = frameValue.CGRectValue()
        }
    }
    
    func keyboardWillShow(notification: NSNotification) {
        if keyboardDismissTapGesture == nil
        {
            println("dismiss")
            keyboardDismissTapGesture = UITapGestureRecognizer(target: self, action: Selector("dismissKeyboard:"))
            self.view.addGestureRecognizer(keyboardDismissTapGesture!)
        }
    }
    
    func keyboardWillHide(notification: NSNotification) {
        if keyboardDismissTapGesture != nil
        {
            println("test2")
            self.view.removeGestureRecognizer(keyboardDismissTapGesture!)
            keyboardDismissTapGesture = nil
        }
    }
    
    func dismissKeyboard(sender: AnyObject) {
        println("dismiss keyboard")
        commentTextField.resignFirstResponder()
    }

我在dismissKeyboard 处设置了一个断点,但它甚至没有被调用。

输出

当我点击文本视图并打开键盘时,这是输出

keyboardFrameChanged
keyboardFrameChanged
will show
dismiss

当我点击其他任何东西(试图关闭键盘)时,没有进一步的输出。

【问题讨论】:

  • 是否调用了键盘显示和隐藏的通知?
  • 我会考虑放置一些 println() 语句,而不是断点,然后看看它有多远。你能帮我们做吗?
  • @chedabob 是的,keyboardWillShow 正在被调用。
  • @LinusG。当然,但我已经在每个函数中都有 println 语句。我还应该在哪里添加它们?
  • 没错,但如果你不显示输出,它们对我们来说毫无用处;)

标签: ios swift uigesturerecognizer


【解决方案1】:

为自己设置手势识别器委托并添加UIGestureRecognizerDelegate 协议。

func keyboardWillShow(notification: NSNotification) {
    if keyboardDismissTapGesture == nil
    {
        println("dismiss")
        keyboardDismissTapGesture = UITapGestureRecognizer(target: view, action: "dismissKeyboard:")
        keyboardDismissTapGesture.delegate = self
        self.view.addGestureRecognizer(keyboardDismissTapGesture!)
    }
}

然后添加:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    return true 
}

我的猜测是,您的表格视图的手势干扰了新的UITapGesture。试试这个解决方案,否则当检测到新的UITapGesture 时,表格视图的手势会失败。

要使表格视图的UITapGestureRecognizer 失败,我使用以下代码:

if let recognizers = yourTableView.gestureRecognizers, let index = find(recognizers.map { $0 is UITapGestureRecognizer }, true) {
    (recognizers[index] as! UIPanGestureRecognizer).requireGestureRecognizerToFail(keyboardDismissTapGesture)
}

也许不是最优雅的方式,但当我想失败 UIPanGestureRecognizer 时,它对我有用。我没有用UITapGestureRecognizer 测试过。

编辑:

if let recognizers = yourTableView.gestureRecognizers, let index = find(recognizers.map { $0 is UIGestureRecognizer }, true) {
    (recognizers[index] as! UIGestureRecognizer).requireGestureRecognizerToFail(keyboardDismissTapGesture!)
}

【讨论】:

  • 谢谢! println("dismiss keyboard") 现在正在被调用,但只有在我之后立即拖动 + 点击时才会调用。手势无法识别单个点击是否有原因?
  • iOS 的默认设置是一次只能识别一个手势。我还没有那么有经验,所以我只能告诉你这个。您可以做的其他事情是使表格视图的点击手势失败。我会在几秒钟内告诉你怎么做。如果这解决了您的问题,请将其标记为已回答:p
  • 谢谢。你介意解释一下手势失败的后果吗?
  • 大声笑,我的意思是我为什么要失败?
  • 对不起,我刚醒来。这意味着,当检测到手势2时,手势1停止工作。当您想要向上或向下平移视图并且您的视图具有表格视图时,这很有用。通常,如果您垂直平移,您将平移您的桌子。如果失败,您可以成功使用手势2。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多