2016-05-14 69 views

回答

1

定义 “作品” 时,它的工作原理。

是的,你可以实例化一个视图控制器,而不必关心它是哪个子类的UIViewController。你从这个方法中得到的对象将是一个视图控制器,因此可以对所有视图控制器进行操作,这是很安全的:以模态方式呈现它,将其推送到导航控制器,将其添加到选项卡控制器,等

但是,如果你打算做一些与你的视图控制器类特定的东西 - 就像SomethingViewController定义一个属性,它允许你选择它显示的Something,并且你想要分配给该属性 - 您需要做两件事:

  1. 在运行时测试您从instantiateViewControllerWithIdentifier得到的对象是您期望它的类。 (因为取决于你传递的标识符,它可能是其他类,或者如果该标识符不在故事板中,则根本没有任何标识符。)
  2. 让编译器知道已将该对象分配给的变量是为该类,以便编译器将允许您访问该类的属性并调用该方法。

转让与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 
+0

谢谢你的回答 –