延迟实例化UIDynamicAnimator与referenceView - Swift



我试图在我的代码中延迟实例化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"发生。

我喜欢这个,因为它既干净又安全

最新更新