2

我正在尝试在我的代码中延迟实例化 UIDynamicAnimator。我想用 UIView 初始化它作为我拥有的 IBOutlet。

class ViewController: UIViewController {

     @IBOutlet var gameView : UIView

     @lazy var animator = UIDynamicAnimator(referenceView: gameView)
...

我假设这不起作用,因为尚未创建 UIView,因为 animator 属性会返回一个错误,指出它找不到游戏视图。

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

4

2 回答 2

3

在会议视频“构建可中断和响应式交互”中,他们正是这样做的。

解决方案是定义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都需要打开它。

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

class ViewController: UIViewController {
    var animator : UIDynamicAnimator!
    @IBOutlet var gameView : UIView
    override func viewDidLoad() {
       super.viewDidLoad()
       animator = UIDynamicAnimator(referenceView: gameView)
       animator.property = value
       ...
    }
...
于 2014-06-19T12:20:40.583 回答
0

使用闭包:

lazy private var dynamo: UIDynamicAnimator = {
        return UIDynamicAnimator(referenceView: self.view)
    }()

“懒惰”意味着它在第一次使用之前不会被初始化。

闭包可以访问 self.view (或您想要使用的任何其他本地视图),但它不会尝试读取它,直到第一次读取“发电机”发生。

我喜欢这种清洁和安全的结合。

于 2016-05-12T19:38:49.513 回答