我试图在我的代码中延迟实例化UIDynamicAnimator。我想用一个UIView初始化它作为一个IBOutlet。
class ViewController: UIViewController {
@IBOutlet var gameView : UIView
@lazy var animator = UIDynamicAnimator(referenceView: gameView)
...
我假设这不起作用,因为UIView还没有创建,因为animator属性抛出了一个错误,说它找不到gameView。
我怎样才能绕过这个?
在会议视频"构建可中断和响应式交互"中,他们正是这样做的。
解决方案是将animator
定义为可选的,并在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)
}()
"Lazy"表示在第一次使用之前不会初始化。
闭包可以访问self。视图(或任何其他你想使用的本地视图),但它不会尝试读取它,直到第一次读取"dynamo"发生。
我喜欢这个,因为它既干净又安全