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

时间:2015-01-12 11:26:36

标签: ios swift action uigesturerecognizer

我有一个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")
    }
}

1 个答案:

答案 0 :(得分:2)

您必须从手势识别器内触发选择器。 要触发选择器,您必须修改UIGestureRecognizer的state属性。这家酒店只读。

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

您需要拥有或创建一个-Bridging-Header.h文件来导入Objective C标题,例如您想要的标题。

如果您的应用中还没有桥头文件,最简单的方法是在项目中添加一个objc类,xcode会询问您是否需要,然后创建文件和将它与您的设置联系起来。然后,您可以删除objc类。

将下一行添加到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