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

3

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

"A_ViewController"是"ABCViewController"的子类

是否有一种方法可以将视图控制器"ABCViewController"从故事板中初始化为"A_ViewController"?

6个回答

6

这是我的做法,希望能有所帮助。

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

object_setClass(abcController, A_ViewController.self) 

现在,如果需要的话,您可以将 abcController 转换为特定的子视图控制器。

使用这种方法有哪些风险或限制? - Haroun SMIDA

4
您无法使用Storyboard完成此操作。`instantiateViewControllerWithIdentifier`将返回`ABCViewController`的实例,您可以将其强制转换为超类(即`UIViewController`),但是强制转换为子类(即`A_ViewController`)将不起作用。您可以在此处了解为什么不能这样做:链接
如果您想要两个具有相同布局但不同类的视图控制器,则应该使用xib。

将其强制转换为子类,但执行了子类的重写方法。 - rd_
1
请检查我的答案,如果有人从这里误导了。 - minhazur

1
我认为你试图做的事情是不可能实现的,原因如下:
在Storyboard中,您需要为特定的UIViewCotnroller UI指定具体的类名。这意味着当您实例化此UIViewController时,将创建该特定类。
在您的情况下,在IB中指定了基类,并且您正在尝试将其向下转换为派生类,这注定会失败。

0

参考故事板,您应该能够将常规转换为基本类型:

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

别忘了在故事板中为视图控制器设置标识符!


这不起作用。它显示了一个错误:“Swift动态转型失败”(EXC_BREAKPOINT.....) - Mohammed

0

不确定您的问题是什么,假设以下情况之一:

1)您想将故事板视图控制器链接到ABC_ViewController的A_ViewController子类。您可以通过从身份检查器中选择“类”来轻松完成此操作:

enter image description here


2)您已经将视图控制器与Storyboard IdentityInspector中的ABCViewController链接,您想以程序方式获取它并作为A_ViewController类型(子类)。您不能向下转型(从父级到子级),因此您不能执行以下操作(假设sbID1是对应于您的视图控制器的StoryBoard ID):

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

原因是,从继承的角度来看,通常情况下你不能将父类型传递为子类型(反之亦然)。只有在你知道最初实例化对象为子类时,才能将父类向下转换为子类。


0

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

enter image description here
  1. 在Storyboard中,创建VC的子2副本
  2. 将VC标识符绑定到Storyboard上
  3. 仅在Base中实现所有IBOutlet和操作
  4. 根据需要从任何类中实例化Child 1和Child 2。

优点:

  1. 这样我们可以为2个不同的VC保留相同的UI。
  2. 我们可以在Base中实现所有与UI相关的功能
  3. 我们可以重用通用代码使用BaseVC
  4. 我们可以在各自的VC即child 1和child 2中实现逻辑。

从技术角度来看,2个VC的UI不完全相同,你必须要分别复制它们。如果有更新,你需要更改两个副本(或者删除并重新克隆第二个副本)。 - Haroun SMIDA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接