懒惰地用 referenceView 实例化 UIDynamicAnimator - Swift

Posted

技术标签:

【中文标题】懒惰地用 referenceView 实例化 UIDynamicAnimator - Swift【英文标题】:Lazy instantiating a UIDynamicAnimator with referenceView - Swift 【发布时间】:2014-06-19 09:20:20 【问题描述】:

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

class ViewController: UIViewController 

     @IBOutlet var gameView : UIView

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

我假设这不起作用,因为 UIView 尚未创建,因为 animator 属性会返回一个错误,说它找不到 gameView。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

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

解决方案是将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
       ...
    
...

【讨论】:

感谢 Jack,没想到将其声明为可选。找到了你谈到的会议视频,所以我也会看一下。感谢您的帮助 另一个快速的问题..这是否意味着我在惰性实例化方法中设置的东西应该在 viewDidLoad 中设置?比如说 Gravity.magnitude 属性? @Sawyer05 遗憾的是,一切都需要去那里。我确实希望他们在未来引入一种干净的方式来做到这一点。【参考方案2】:

使用闭包:

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

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

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

我喜欢这样既干净又安全。

【讨论】:

以上是关于懒惰地用 referenceView 实例化 UIDynamicAnimator - Swift的主要内容,如果未能解决你的问题,请参考以下文章

Python:为啥 Tkinter 类实例化必须使用 Frame?

PyQt5如何在主UI中实例化多个UI

Unity UI 缩放和实例化预制件

Unity XR Single Pass 实例化渲染和 UI

懒惰地导入 UI 模块/组件的最佳方法是啥

当对象在运行时实例化时,如何使 Unity UI 对象可拖动?