首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用UIDynamicAnimator - Swift延迟实例化referenceView

使用UIDynamicAnimator - Swift延迟实例化referenceView
EN

Stack Overflow用户
提问于 2014-06-19 09:20:20
回答 2查看 501关注 0票数 2

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

代码语言:javascript
复制
class ViewController: UIViewController {

     @IBOutlet var gameView : UIView

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

我假设这不起作用,因为还没有创建UIView,因为动画器属性会抛出一个错误,说它找不到gameView。

我怎么才能避开这一切?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-19 12:20:40

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

解决方案是将animator定义为可选的,并在viewDidLoad中初始化它。

代码语言:javascript
复制
class ViewController: UIViewController {
    var animator : UIDynamicAnimator?
    @IBOutlet var gameView : UIView
    override func viewDidLoad() {
       super.viewDidLoad()
       animator = UIDynamicAnimator(referenceView: gameView)
       animator!.property = value
       ...
    }
...

我有点不喜欢这样做,因为将来对animator的引用都需要解包。

一个稍微好一点的方法是将它定义为一个隐式未包装的可选选项。所以看起来是这样:

代码语言:javascript
复制
class ViewController: UIViewController {
    var animator : UIDynamicAnimator!
    @IBOutlet var gameView : UIView
    override func viewDidLoad() {
       super.viewDidLoad()
       animator = UIDynamicAnimator(referenceView: gameView)
       animator.property = value
       ...
    }
...
票数 3
EN

Stack Overflow用户

发布于 2016-05-12 19:38:49

使用闭包:

代码语言:javascript
复制
lazy private var dynamo: UIDynamicAnimator = {
        return UIDynamicAnimator(referenceView: self.view)
    }()

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

闭包可以访问self.view (或您想使用的任何其他本地视图),但在第一次读取"dynamo“之前,它不会尝试读取它。

我喜欢它既干净又安全。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24303062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档