用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(或任何你想使用的其他本地视图),但它不会尝试读取它,直到第一次阅读“发电机”发生。
我喜欢这个清洁和安全的组合。