0

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

let dragger: UIPanGestureRecognizer

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

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

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

因此,我无法在调用 toUIPanGestureRecognizer(target:action:) 之前调用 to创建手势识别器,super.init(coder)因为我需要将 self 传递给该平移手势初始化程序,

...并且我不能在调用UIPanGestureRecognizer(target:action:) 之后调用super.init(coder),因为我必须在调用超类初始化程序之前为所有必需的常量/变量设置值。

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

我在这里错过了什么吗?

4

2 回答 2

1

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

在您的初始化中:

dragger = UIPanGestureRecognizer()
super.init(coder)
dragger.target = self
dragger.action = <actionHandler>
于 2015-04-06T15:48:18.087 回答
0

你能做什么使它隐含地展开。类似于 IBOutlets 的贴花方式,因为在您的情况下,您知道您将配置一个有效的手势。所以我将其声明为

class ViewController: UIViewController {
    let dragger: UIPanGestureRecognizer!
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        dragger = UIPanGestureRecognizer(target: self, action: "mySelector:")
    }
}
于 2015-04-06T13:56:29.337 回答