2015-04-06 63 views
0

我有一個UIView的自定義子類。它有,我已經設置爲所需的恆定平移手勢識別:Catch-22創建一個泛手勢識別器作爲常量?

let dragger: UIPanGestureRecognizer 

,因爲它是在視圖的初始化創建一次,持續視圖的一生這是一個常數。

在視圖的指定初始化程序init(coder)中,我想創建我的平移手勢識別器並將其連接起來。但是,在Xcode 6.3下,如果手勢識別器是常量,我似乎無法做到這一點。 (這只是Xcode 6.3 beta版本下的一個問題)代碼允許我在調用super.init(coder)之後設置平移手勢初始值設定程序)

由於該變量是一個必需常量,因此需要在調用之前設置它超類init(coder)。但是,平底手勢識別器的唯一初始化工具將自己作爲參數。直到我呼叫super.init(coder)之後,自我纔可用。

所以,我不能創建我的通話手勢識別來UIPanGestureRecognizer(target:action:)以前調用super.init(coder)因爲我需要通過自我到平移手勢初始化,

...我不能請致電UIPanGestureRecognizer(target:action:)AFTER調用super.init(coder),因爲我必須在調用超類初始化器之前爲所有必需的常量/變量設置值。

我能想出的唯一解決方案是讓我的手勢識別器成爲一個可選的var,我寧願不這樣做。在初始化器完成後它會始終有一個值,並且每次使用它時都必須打開可選的令人討厭的選項。

我在這裏錯過了什麼嗎?

+0

我沒有把它這樣做的時候考到結束,但是編譯器不會拋出一個錯誤:讓牽引= UIPanGestureRecognizer() – Thomas 2015-04-06 13:57:23

+0

然後呢?在調用'super.init(coder)'後添加一個目標/動作到手勢識別器?我猜這是行得通的,但手勢識別器的文檔說'UIPanGestureRecognizer(target:action:)'是指定的初始化器,你應該調用指定的初始化器。 – 2015-04-06 14:04:36

+0

任何事情可以阻止你形成一個懶惰的計算屬性? – 2015-04-06 14:06:54

回答

1

如果aahrens的解決方案不工作(也許是因爲一個錯誤的),這裏是我會做什麼,即使如你所指出的,文檔說這不是指定方式:

在你的初始化:

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

這或多或少是我最終做的。 (我使用了'addTarget(_,action:)'方法 – 2015-04-06 15:53:01

0

你可以做什麼使它隱含解開。類似於IBOutlets如何被剝離,因爲在你的情況下,你知道你將會配置一個有效的手勢。因此,我將宣佈它作爲

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

這仍然不能解決在調用超類初始化器之前不得不分配它的catch-22。 – 2015-04-06 14:31:28

+0

我不知道這是否是Xcode 6.3中的錯誤。我的答案中的代碼在Xcode 6.2中爲我工作。 – aahrens 2015-04-06 14:36:12

+0

Apple的文檔說他們使Swift規範對1.2更嚴格。這可能是一個例子,而不是一個錯誤。 – 2015-04-09 14:14:34