我正在尝试在代码中延迟实例化一个UIDynamicAnimator。我想用一个UIView初始化它,作为一个IBOutlet。
class ViewController: UIViewController {
@IBOutlet var gameView : UIView
@lazy var animator = UIDynamicAnimator(referenceView: gameView)
...我假设这不起作用,因为还没有创建UIView,因为动画器属性会抛出一个错误,说它找不到gameView。
我怎么才能避开这一切?
发布于 2014-06-19 12:20:40
在会话视频“构建可中断和响应性的交互”中,他们正是这样做的。
解决方案是将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
...
}
...发布于 2016-05-12 19:38:49
使用闭包:
lazy private var dynamo: UIDynamicAnimator = {
return UIDynamicAnimator(referenceView: self.view)
}()"Lazy“意味着它在第一次使用之前不会被初始化。
闭包可以访问self.view (或您想使用的任何其他本地视图),但在第一次读取"dynamo“之前,它不会尝试读取它。
我喜欢它既干净又安全。
https://stackoverflow.com/questions/24303062
复制相似问题