let someVC = self.storyboard!.instantiateViewControllerWithIdentifier("something") as! SomethingViewController
为什么我们需要使用"as!数据输入视图控制器">
当我使用 xcode 7.3.1 将其取出时它可以工作
定义"作品"。
是的,您可以实例化视图控制器,而无需关心它是UIViewController
的哪个子类。你从该方法返回的对象将是一个视图控制器,所以用它做一些可以对所有视图控制器做的事情是安全的:以模式方式呈现它,将其推送到导航控制器上,将其添加到选项卡控制器等。
但是,如果您要对它执行特定于视图控制器类的操作(例如,如果SomethingViewController
定义了一个属性,该属性允许您选择显示Something
,并且您希望分配给该属性(,则需要执行两项操作:
- 在运行时测试您从
instantiateViewControllerWithIdentifier
中返回的对象是否是您期望的类。(因为根据您传递的标识符,它可能是其他类,或者如果该标识符不在情节提要中,则什么都没有。 - 让编译器知道您为该对象赋值的变量是为该类键入的,以便编译器允许您访问该类的属性和调用方法。
使用as?
或as!
演员的分配可以一步完成这两件事。(是使用 as?
还是使用 as!
取决于你对自己的信任程度,以确保你的故事板标识符是他们声称的,以及你想如何处理这些假设的失败。
事实上,即使您没有使用特定于该视图控制器类的属性或方法,该as!
强制转换也会添加一个运行时检查,以确定您的视图控制器类是否是您所期望的。因此,当你取出演员时,没有任何损坏的事实并不表明演员是多余的 - 这表明演员正在检查的任何破损目前都没有发生。
也就是说,如果有人更改了您的故事板,以便标识符"某物"位于SomethingElseViewController
上,您引用的行将导致崩溃。如果你把那个演员拿出来,你就不会在那里坠毁。(你以后可能会遇到麻烦。
但是,如果您真正想做的是断言故事板和程序的有效性,那么最好明确这一点:
let someVC = self.storyboard!.instantiateViewControllerWithIdentifier("something")
assert(someVC is SomethingViewController)
// then do something non-SomethingViewController-specific with it