Ленивый экземпляр UIDynamicAnimator с referenceView - Swift

Я пытаюсь создать ленивый экземпляр UIDynamicAnimator в моем коде. Я хочу инициализировать его UIView как IBOutlet, который у меня есть.

class ViewController: UIViewController {

     @IBOutlet var gameView : UIView

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

Я предполагаю, что это не работает, потому что UIView еще не создан, потому что свойство animator возвращает ошибку, говоря, что не может найти gameView.

Как я могу обойти это?

2 ответа

Решение

В видео-сессии "Построение прерываемых и отзывчивых взаимодействий" они сделали именно это.

Решение состоит в том, чтобы определить 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 нужно будет все развернуть.

Немного лучший подход imo состоит в том, чтобы определить его как неявно развернутый необязательный. Так это будет выглядеть так:

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 (или какому-либо другому локальному представлению, которое вы хотите использовать), но оно не пытается прочитать его, пока не произойдет первое чтение "динамо".

Мне нравится это как сочетание чистого и безопасного.

Другие вопросы по тегам