用referenceView – Swift懒惰的实例化一个UIDynamicAnimator

我试图在我的代码中实例化一个UIDynamicAnimator。 我想用UIView作为IBOutlet进行初始化。

class ViewController: UIViewController { @IBOutlet var gameView : UIView @lazy var animator = UIDynamicAnimator(referenceView: gameView) ... 

我假设这是行不通的,因为UIView尚未创build,因为animator属性抛出一个错误,说它找不到gameView。

我怎样才能解决这个问题?

在会议录像“build立可中断和响应的相互作用”,他们做到了这一点。

解决scheme是将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者的引用都需要解开它。

一个稍微好一点的方法是将其定义为隐式解包的可选项。 所以它看起来像这样:

 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(或任何你想使用的其他本​​地视图),但它不会尝试读取它,直到第一次阅读“发电机”发生。

我喜欢这个清洁和安全的组合。

Interesting Posts