swift:在viewDidLoad

时间:2015-06-26 12:55:21

标签: ios swift viewdidload let

我实际上在UIViewController上处理unwrapped可选常量时遇到了一些麻烦。

因为UI组件仅在viewDidLoad调用之后才存在,所以我似乎不能在需要GUI依赖的常量变量上使用'let'常量修饰符。

以下是一个例子:

class ViewController: UIViewController {

    @IBOutlet weak var blueSquare: UIView!
    var animator:UIDynamicAnimator!

    required init(coder aDecoder: NSCoder) {
        // If animator was constant, it should be initialized here.
        // But blueSquare is not initialized at this time, so I can't
        // call UIDynamicAnimator(referenceView:  blueSquare)
        super.init(coder: aDecoder)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // At this time, the initialisation is ok. But animator is now
        // actually modifiable
        self.animator = UIDynamicAnimator(referenceView:  blueSquare)
    }
}

正如您所看到的,动画师被编写为好像可以修改。打算不是。

我的问题是:是否有任何好的模式可以将'animator'作为常量?我没有找到任何处理viewDidLoad和GUI依赖范例常量的文档。

1 个答案:

答案 0 :(得分:0)

这就是为什么你应该利用选项。

宣布:

var animator:UIDynamicAnimator!

您使编译器相信动画师在调用init(编码器)之前不必进行初始化。这是你在这里玩的危险游戏。相反,你更愿意使用:

var animator:UIDynamicAnimator?

因此在初始化之前使用var会报告为错误。然后你可以在viewDidLoad中设置它,然后事情就会回到原来的位置。

你认为blueSquare只能在控制器的生命周期中使用,这是正确的,这与Swift语法无关;这是一个框架约束。因此,您需要将animator声明为悬挂参考,直到它可以被用于有用的东西。这是可选项为您提供的内容。