懒惰地用 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?