从故事板向下/向上转换视图控制器

时间:2015-03-31 17:42:32

标签: ios xcode swift

如果我的故事板包含一个名为&#34的视图控制器; ABCViewController"

" A_ViewController"是" ABCViewController"

的子类

有没有办法启动视图控制器" ABCViewController"从故事板中作为" A_ViewController" ?

6 个答案:

答案 0 :(得分:5)

这是我的工作。希望它有所帮助。

let abcController =  storyboard.instantiateViewControllerWithIdentifier("ABCViewController") as ABCViewController

object_setClass(abcController, A_ViewController.self) 

现在您可以根据需要将abcController强制转换为特定的子视图控制器。

答案 1 :(得分:4)

你无法用故事板做到这一点。 instantiateViewControllerWithIdentifier将返回ABCViewController的实例,您可以将其强制转换为超类(即UIViewController),但转换为子类(A_ViewController)将无效。您可以阅读为什么不能这样做here

如果你想让两个视图控制器具有相同的布局,但是不同的类应该使用xib

答案 2 :(得分:1)

我认为没有可能实现你想做的事情,理由是:

在Storyboard中,您可以为IB指定特定UIViewCotnroller UI的具体类名。这意味着当您实例化此UIViewController时,将创建特定的类。

在你的情况下,在IB中指定了基类,并且你试图向下传播一个必然会失败的派生类。

答案 3 :(得分:0)

通过对故事板的引用,您应该能够对基本类型进行常规强制转换:

let myController = storyboard.instantiateViewControllerWithIdentifier("MyViewController") as UIViewController

请记住在故事板中设置视图控制器的标识符!

答案 4 :(得分:0)

不确定你在问什么,假设有下列之一:

1)您想将storyboard viewcontroller链接到ABC_ViewController的A_ViewController子类。您可以通过从身份检查器中选择Class来执行此操作:

enter image description here


2)您已经从故事板IndentityInspector链接到 ABCViewController 的ViewController,并且您希望以编程方式将其作为 A_ViewController 类型(子类)获取。
不能垂头丧气(从父母到孩子),所以你不能这样做(假设sbID1是与你的视图控制器对应的StoryBoard ID):

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewControllerWithIdentifier("sbID1") as A_ViewController

原因在于,一般来说,从继承POV中,您不能将父类型作为子类型传递(仅限于其他方式)。只有当您知道最初将对象实例化为Child时,才能从Parent转换为Child。

答案 5 :(得分:0)

我尝试了不同的方法,但无法解决。我使用以下方法来解决它: enter image description here

  1. 在情节提要中,创建带有子项2的VC副本
  2. 将VC标识符绑定到情节提要
  3. 仅在Base中实施所有IBOutlet和操作
  4. 根据需要实例化任何类别的孩子1和孩子2。

好处:

  1. 这样,我们可以为2个不同的VC保留sam UI。
  2. 我们可以在Base中实现所有与UI相关的功能
  3. 我们可以使用BaseVC重用常见代码
  4. 我们可以在相应的VC中实现逻辑,即孩子1和孩子2