如果我的故事板包含一个名为&#34的视图控制器; ABCViewController"
" A_ViewController"是" ABCViewController"
的子类有没有办法启动视图控制器" ABCViewController"从故事板中作为" A_ViewController" ?
答案 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来执行此操作:
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)