Catch-22 将创建平移手势识别器作为常量?

Catch-22 with creating a pan gesture recognizer as a constant?

我有一个 UIView 的自定义子类。它有一个平移手势识别器,我已将其设置为必需的常量:

let dragger: UIPanGestureRecognizer

它是一个常量,因为它在视图初始化时创建一次,并在视图的整个生命周期内持续存在。

在视图的指定初始化程序中,init(coder),我想创建我的平移手势识别器并将其连接起来。但是,在 Xcode 6.3 下,如果手势识别器是常量,我似乎无法做到这一点。 (这似乎只是 Xcode 6.3 beta 下的问题代码允许我在调用 super.init(coder) 后设置平移手势初始化器)

由于变量是必需的常量,因此需要在我调用超类之前设置它init(coder)。但是,平移手势识别器的唯一初始化程序将 self 作为参数。在我调用 super.init(coder).

之前,Self 不可用

因此,我无法通过在 调用 super.init(coder) 之前调用 UIPanGestureRecognizer(target:action:) 来创建我的手势识别器,因为我需要将自己传递给平移手势初始值设定项,

...我无法在 super.init(coder) 调用 UIPanGestureRecognizer(target:action:) AFTER 之后调用 super.init(coder),因为我必须为所有必需的 constants/variables 在调用超类初始化程序之前。

我能想出的唯一解决方案是让我的手势识别器成为一个可选的 var,我不想这样做。在初始化器完成后它总是有一个值,每次我使用它时都必须打开一个可选的,这很烦人。

我是不是漏掉了什么?

你可以做什么让它隐式解包。类似于 IBOutlets 的贴标方式,因为在您的情况下,您知道您将配置一个有效的手势。所以我将其声明为

class ViewController: UIViewController {
    let dragger: UIPanGestureRecognizer!
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        dragger = UIPanGestureRecognizer(target: self, action: "mySelector:")
    }
}

如果 aahrens 的解决方案不起作用(可能是因为错误),这就是我会做的,即使正如您指出的那样,文档说这不是指定的方式:

在你的初始化中:

dragger = UIPanGestureRecognizer()
super.init(coder)
dragger.target = self
dragger.action = <actionHandler>