未调用手势识别器
Gesture Recognizer Not Called
我已经设置了一个手势识别器,用于在用户点击文本字段外部时关闭键盘。 DismissKeyboard
函数未被调用。
我是否设置了错误的观察者或者这是一个不同的问题?另外,这是一个正在被点击的表格视图。
代码摘录
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
当我点击其他任何东西(试图关闭键盘)时,没有进一步的输出。
将手势识别器委托设置为您自己并添加 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
}
我的猜测是,您的 table 视图的手势干扰了新的 UITapGesture
。试试这个解决方案,否则当检测到新的 UITapGesture
时,您应该使 table 视图的手势失败。
要使 table 视图的 UITapGestureRecognizer
失败,我使用此代码:
if let recognizers = yourTableView.gestureRecognizers, let index = find(recognizers.map { [=12=] is UITapGestureRecognizer }, true) {
(recognizers[index] as! UIPanGestureRecognizer).requireGestureRecognizerToFail(keyboardDismissTapGesture)
}
也许不是最优雅的做法,但当我想使 UIPanGestureRecognizer
失败时,它对我有用。我还没有用 UITapGestureRecognizer
.
测试过它
编辑:
if let recognizers = yourTableView.gestureRecognizers, let index = find(recognizers.map { [=13=] is UIGestureRecognizer }, true) {
(recognizers[index] as! UIGestureRecognizer).requireGestureRecognizerToFail(keyboardDismissTapGesture!)
}
我已经设置了一个手势识别器,用于在用户点击文本字段外部时关闭键盘。 DismissKeyboard
函数未被调用。
我是否设置了错误的观察者或者这是一个不同的问题?另外,这是一个正在被点击的表格视图。
代码摘录
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
当我点击其他任何东西(试图关闭键盘)时,没有进一步的输出。
将手势识别器委托设置为您自己并添加 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
}
我的猜测是,您的 table 视图的手势干扰了新的 UITapGesture
。试试这个解决方案,否则当检测到新的 UITapGesture
时,您应该使 table 视图的手势失败。
要使 table 视图的 UITapGestureRecognizer
失败,我使用此代码:
if let recognizers = yourTableView.gestureRecognizers, let index = find(recognizers.map { [=12=] is UITapGestureRecognizer }, true) {
(recognizers[index] as! UIPanGestureRecognizer).requireGestureRecognizerToFail(keyboardDismissTapGesture)
}
也许不是最优雅的做法,但当我想使 UIPanGestureRecognizer
失败时,它对我有用。我还没有用 UITapGestureRecognizer
.
编辑:
if let recognizers = yourTableView.gestureRecognizers, let index = find(recognizers.map { [=13=] is UIGestureRecognizer }, true) {
(recognizers[index] as! UIGestureRecognizer).requireGestureRecognizerToFail(keyboardDismissTapGesture!)
}