自定义 Swift UIGestureRecognizer 不调用分配的操作

Custom Swift UIGestureRecognizer does not call assigned action

我有一个 UIViewController,其中一个视图添加了自定义 UIGestureRecognizer。问题是我从 DialGestureRecognizer 获得了所有触摸打印线,但从未调用过 handleDial 操作。 (iOS 8 / Xcode 6.1.1) 我做错了什么?任何帮助表示赞赏。

@IBOutlet var dialView:UIView?

override func viewDidLoad() {
    super.viewDidLoad()

    if let _dialView = dialView? {
        let recognizer = DialGestureRecognizer(target:self, action:"handleDial:")
        _dialView.addGestureRecognizer(recognizer)
    }

    func handleDial(recognizer:DialGestureRecognizer) {
        println("handleDial")
    }
}

自定义(精简)UIGestureRecognizer 如下所示

class DialGestureRecognizer:UIGestureRecognizer {        
    func touchesBegan(touches:NSSet!, withEvent event:UIEvent!)  {
        println("touchesBegan")
    }

    func touchesMoved(touches:NSSet!, withEvent event:UIEvent!) {
        println("touchesMoved")
    }

    func touchesEnded(touches:NSSet!, withEvent event:UIEvent!) {
        println("touchesEnded")
    }
}

您必须从手势识别器内部触发选择器。 要触发选择器,您必须修改 UIGestureRecognizer 的状态 属性。此 属性 是只读的。

要进行修改,您必须按如下方式添加 BridgingHeader。

您需要拥有或创建一个 -Bridging-Header.h 文件来导入 Objective C header 所需的文件。

如果您的应用程序中还没有桥 header 文件,最简单的方法是向您的项目添加一个 objc class,然后 xcode将询问您是否需要一个,然后创建文件并将其绑定到您的设置中。然后您可以删除 objc class.

将下一行添加到 Bridging Header 文件。

#import <UIKit/UIGestureRecognizerSubclass.h>

然后您可以修改 self.state 属性 来触发事件。

override func touchesBegan(touches:NSSet!, withEvent event:UIEvent!)  {
    println("touchesBegan")
    self.state = UIGestureRecognizerState.Began
} 

阅读更多信息 http://www.raywenderlich.com/76020/using-uigesturerecognizer-with-swift-tutorial