簡體   English   中英

使用referenceView懶惰地實例化UIDynamicAnimator-Swift

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM