let someVC = self.storyboard!.instantiateViewControllerWithIdentifier("something") as! SomethingViewController
为什么我们需要使用 “作为!DataEntryViewController”为什么instantiateViewControllerWithIdentifier需要使用“as!”
我把它拿出来使用的Xcode 7.3.1
let someVC = self.storyboard!.instantiateViewControllerWithIdentifier("something") as! SomethingViewController
为什么我们需要使用 “作为!DataEntryViewController”为什么instantiateViewControllerWithIdentifier需要使用“as!”
我把它拿出来使用的Xcode 7.3.1
定义 “作品” 时,它的工作原理。
是的,你可以实例化一个视图控制器,而不必关心它是哪个子类的UIViewController
。你从这个方法中得到的对象将是一个视图控制器,因此可以对所有视图控制器进行操作,这是很安全的:以模态方式呈现它,将其推送到导航控制器,将其添加到选项卡控制器,等
但是,如果你打算做一些与你的视图控制器类特定的东西 - 就像SomethingViewController
定义一个属性,它允许你选择它显示的Something
,并且你想要分配给该属性 - 您需要做两件事:
instantiateViewControllerWithIdentifier
得到的对象是您期望它的类。 (因为取决于你传递的标识符,它可能是其他类,或者如果该标识符不在故事板中,则根本没有任何标识符。)转让与as?
或as!
演员一举两得。 (是否使用as?
或as!
只是取决于你有多少信任你自己,以确保您的故事板标识符是什么他们要求是,你希望如何处理这些假设的失败。)
事实上,即使你不使用特定于该视图控制器类的属性或方法,as!
强制转换会添加一个运行时检查,以确定视图控制器类是您期望的。因此,当你演员出场时什么都不会中断,这不是一个表明演员是多余的迹象 - 这是一个迹象表明,演员们正在检查的任何破坏现在都没有发生。
也就是说,如果有人更改了故事板以便标识符“something”位于SomethingElseViewController
上,则引用的行将导致崩溃。如果你把它扔掉了,你就不会在那里崩溃。 (你很可能就会遇到麻烦。)
但是,如果你真的想要做的是坚持你的故事板和程序的有效性,它可能会更好要清楚的是:
let someVC = self.storyboard!.instantiateViewControllerWithIdentifier("something")
assert(someVC is SomethingViewController)
// then do something non-SomethingViewController-specific with it
谢谢你的回答 –
如果它没有它,那么你不需要它。 – rmaddy