【问题标题】:Catch-22 with creating a pan gesture recognizer as a constant?Catch-22 将平移手势识别器创建为常量?
【发布时间】:2015-06-10 22:20:41
【问题描述】:

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

let dragger: UIPanGestureRecognizer

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

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

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

所以,我无法通过调用UIPanGestureRecognizer(target:action:)调用super.init(coder) 来创建我的手势识别器,因为我需要将self 传递给那个平移手势初始化器,

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

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

我错过了什么吗?

【问题讨论】:

  • 我没有测试到最后,但是编译器在这样做的时候并没有抛出错误:let dragger = UIPanGestureRecognizer()
  • 然后呢?调用super.init(coder) 后向手势识别器添加目标/动作?我想这会起作用,但手势识别器的文档说 UIPanGestureRecognizer(target:action:) 是指定的初始化程序,你应该调用指定的初始化程序。
  • 有什么东西阻止你把它变成一个惰性计算的属性?
  • 我可以让它变得懒惰,但我的目标是让它成为一个必需的常量。 lazy 仅适用于 var 属性。
  • @Thomas,您使用 UIPanGestureRecognizer() 的简单初始化程序然后在调用超类初始化程序后添加目标/动作的解决方案是我发现的唯一一个可以让我将其保留为必需的解决方案常数(让)。发表您的建议作为答案,我会接受。

标签: swift object-initializers xcode6.3


【解决方案1】:

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

在你的初始化中:

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

【讨论】:

  • 这或多或少是我最终做的。 (我用的方法addTarget(_, action:)
【解决方案2】:

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

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

【讨论】:

  • 这仍然不能解决在调用超类初始化程序之前必须分配它的 catch-22。
  • 我想知道这是否是 Xcode 6.3 中的错误。我的答案中的代码在 Xcode 6.2 中对我有用
  • Apple 的文档说他们在 1.2 中使 Swift 规范更加严格。这可能是一个例子,而不是错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多