在 Swift 中将 UIGestureRecognizer 初始化为属性定义的一部分



我想初始化一个UIPanGestureRecognizer作为UIViewController属性定义的一部分,这样我就不必声明它是可选的(如果初始化只发生在viewDidLoad中,我将不得不这样做)。

以下两次尝试在编译时都失败了(我使用的是最新版本的 Xcode):

-- 1st attempt
class TestController: UIViewController {
    let panGestureRecognizer: UIPanGestureRecognizer
    required init(coder: NSCoder) {
        super.init(coder: coder)
        panGestureRecognizer = UIPanGestureRecognizer(  target: self, action: "handlePan:")
        // fails with "Property 'self.panGestureRecognizer' not initialized at super.init call' or
        // fails with "'self' used before super.init call'
        // depending on the order of the two previous statements
    }
}
-- 2st attempt
class TestController: UIViewController {
    let panGestureRecognizer = UIPanGestureRecognizer(target:self, action: "handlePan:")
    // fails with "Type 'TestController -> () -> TestController!' does not conform to protocol 'AnyObject'
}

是否有另一种有效的语法可以完成这项工作?

问题是您在self准备就绪之前将self添加为目标。

您可以创建手势识别器,调用超级初始化,然后将 self 添加为目标,我认为这将起作用。

我个人倾向于把它变成一个lazy var而不是let。它保持封装,并使您不必重写 init 方法。

最新更新