1

我有一个使用 Size Classes 的故事板的 swift 项目,这是一个符合 UITraitEnvironment 协议并实现了功能的 ViewController traitCollectionDidChange

当我第一次启动应用程序时traitCollectionDidChange,这似乎是合理的——它允许开发人员处理应用程序提供的第一个大小类,但是previousTraitCollection传递给它的变量是nil. 我无法检查此值是否nil为非可选,并且以任何方式访问它都会导致崩溃。在函数声明中将参数更改为可选会导致构建错误,抱怨我没有在协议中实现所需的方法。

现在我已经设法通过创建一个单独的函数来解决这个问题,该函数接受一个相同类型的可选变量,然后我可以检查它,但我想知道为什么会这样。

如果它对任何人都有用,这是我要覆盖的功能

override func traitCollectionDidChange(previousTraitCollection: UITraitCollection) {
    // Accessing previousTraitCollection causes a crash
}

任何人都可以对此有所了解吗?

4

1 回答 1

2

您必须声明参数的类型是可选的,因为访问它会强制编译器尝试解压导致崩溃的地址。将其替换为:

override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
    // Accessing previousTraitCollection causes a crash
}
于 2014-10-15T10:16:52.437 回答