为什么实例化视图控制器与标识符需要使用"as!"


let someVC  = self.storyboard!.instantiateViewControllerWithIdentifier("something") as! SomethingViewController

为什么我们需要使用"as!数据输入视图控制器">

当我使用 xcode 7.3.1 将其取出时它可以工作

定义"作品"。

是的,

您可以实例化视图控制器,而无需关心它是UIViewController的哪个子类。你从该方法返回的对象将是一个视图控制器,所以用它做一些可以对所有视图控制器做的事情是安全的:以模式方式呈现它,将其推送到导航控制器上,将其添加到选项卡控制器等。

但是,如果您要对它执行特定于视图控制器类的操作(例如,如果SomethingViewController定义了一个属性,该属性允许您选择显示Something,并且您希望分配给该属性(,则需要执行两项操作:

  1. 在运行时测试您从instantiateViewControllerWithIdentifier中返回的对象是否是您期望的类。(因为根据您传递的标识符,它可能是其他类,或者如果该标识符不在情节提要中,则什么都没有。
  2. 让编译器知道您为该对象赋值的变量是为该类键入的,以便编译器允许您访问该类的属性和调用方法。

使用as?as!演员的分配可以一步完成这两件事。(是使用 as? 还是使用 as! 取决于你对自己的信任程度,以确保你的故事板标识符是他们声称的,以及你想如何处理这些假设的失败。


事实上,即使您没有使用特定于该视图控制器类的属性或方法,该as!强制转换也会添加一个运行时检查,以确定您的视图控制器类是否是您所期望的。因此,当你取出演员时,没有任何损坏的事实并不表明演员是多余的 - 这表明演员正在检查的任何破损目前都没有发生。

也就是说,如果有人更改了您的故事板,以便标识符"某物"位于SomethingElseViewController上,您引用的行将导致崩溃。如果你把那个演员拿出来,你就不会在那里坠毁。(你以后可能会遇到麻烦。

但是,如果您真正想做的是断言故事板和程序的有效性,那么最好明确这一点:

let someVC  = self.storyboard!.instantiateViewControllerWithIdentifier("something")
assert(someVC is SomethingViewController)
// then do something non-SomethingViewController-specific with it

最新更新