2016-11-23 77 views
0

我有一个ViewController(BViewController),它是继承自另一个UIViewController子类(AViewController)。 (我想这样做的原因是,我重新使用故事板3次以上的不同的屏幕相同的看法。)Swift3:投射UIViewController子类失败

当我打电话:

let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
     let vc = storyboard.instantiateViewController(withIdentifier: "AViewController") as! BViewController 
     self.show(vc, sender: self) 

我得到这个错误:

Could not cast value of type 'test.AViewController' (0x10d08b478) to 'test.BViewController' (0x10d08b3f0). 

这里是我的子类,它们没有任何内容。

class AViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 

-

class BViewController: AViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 

在故事板类,因为我想分享所有的孩子IBOutlets而无需重新创建视图设置为AViewController。我的UIStoryboard中只有一个View Controller Scene

+2

如果你设置了类'AViewController'情节板中的你不能投你的视图控制器'BViewController'(AViewController'的'子类或不)。 – albertamg

+2

B是A,但A不是B,这意味着您可以将B投射到A,但不投A到B. – Mercurial

+0

我取消设置类,现在我得到:无法将'UIViewController'类型的值(0x10260c718)转换为' test.BViewController'(0x1009bf3f0)。 – arooo

回答

0

你可能不把正确的视图控制器标识:

let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
let vc = storyboard.instantiateViewController(withIdentifier: "BViewController") as! BViewController 
self.show(vc, sender: self) 

(的AViewController BViewController代替)

编辑: 这里有一个例子:我有一个SignupVC视图控制器我的故事板,但它的故事板ID是“signup_vc”

enter image description here

+0

标识符是AViewController,因为这是父类 - 所有后继的子类AViewController(CViewController,DViewController)使用单个UIViewController与标识符AViewController共享IBOutlets – arooo

+0

不过,我认为你应该把BViewController作为故事板标识符放在你的第二个视图控制器和你的第一个AViewController。 –

+0

他们可以有不同的故事板ID,即使其中一个是其他人的父母。故事板ID(放在故事板中)不是课程名称。 –

0

您必须将您的视图控制器的类设置为故事板中的BViewController

相关问题