[英]Lazy instantiating a UIDynamicAnimator with referenceView - Swift
我試圖在我的代碼中實例化一個UIDynamicAnimator。 我想用UIView作為我的IBOutlet初始化它。
class ViewController: UIViewController {
@IBOutlet var gameView : UIView
@lazy var animator = UIDynamicAnimator(referenceView: gameView)
...
我以為這是行不通的,因為尚未創建UIView,因為animator屬性會拋出一個錯誤,指出無法找到gameView。
我該如何解決?
在會議視頻“建立可中斷和響應式交互”中,他們正是這樣做的。
解決方案是將animator
定義為Optional並在viewDidLoad
內部對其進行初始化。
class ViewController: UIViewController {
var animator : UIDynamicAnimator?
@IBOutlet var gameView : UIView
override func viewDidLoad() {
super.viewDidLoad()
animator = UIDynamicAnimator(referenceView: gameView)
animator!.property = value
...
}
...
我對此有點不喜歡,因為將來對animator
引用都需要解開。
imo的一種更好的方法是將其定義為隱式展開的可選。 所以它看起來像這樣:
class ViewController: UIViewController {
var animator : UIDynamicAnimator!
@IBOutlet var gameView : UIView
override func viewDidLoad() {
super.viewDidLoad()
animator = UIDynamicAnimator(referenceView: gameView)
animator.property = value
...
}
...
使用閉包:
lazy private var dynamo: UIDynamicAnimator = {
return UIDynamicAnimator(referenceView: self.view)
}()
“惰性”表示直到首次使用它才會被初始化。
該閉包可以訪問self.view(或您要使用的任何其他本地視圖),但是在第一次讀取“ dynamo”之前,它不會嘗試讀取它。
我喜歡將清潔和安全結合在一起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.