添加子视图控制器swift

我试图将子视图控制器添加到一个containerViewController

孩子是:

AViewController BViewController CViewController 

我没有错误,但是当我启动应用程序,我可以刷屏,有3个部分刷卡,但A,B,C视图控制器不会出现..

这是我的代码,任何想法?

 import UIKit class ContainerViewController: UIViewController { @IBOutlet var scrollView: UIScrollView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. // creat VC var Avc : AViewController = AViewController () var Bvc : BViewController = BViewController () var Cvc : CViewController = CViewController () // add it to the view hierarchie self.addChildViewController(Cvc) self.scrollView.addSubview(Cvc.view) Cvc.didMoveToParentViewController(self) self.addChildViewController(Bvc) self.scrollView.addSubview(Bvc.view) Bvc.didMoveToParentViewController(self) self.addChildViewController(Avc) self.scrollView.addSubview(Avc.view) Avc.didMoveToParentViewController(self) // set the frame var adminFrame : CGRect = Avc.view.frame adminFrame.origin.x = adminFrame.width Bvc.view.frame = adminFrame var BFrame : CGRect = Bvc.view.frame BFrame.origin.x = 2*BFrame.width Cvc.view.frame = BFrame // set the frame of the scrollview var scrollWidth: CGFloat = 3*self.view.frame.width var scrollHeight: CGFloat = self.view.frame.size.height self.scrollView.contentSize = CGSizeMake(scrollWidth, scrollHeight) } 

编辑:

查看视图层次结构,它报告以下内容:

 <UIWindow: 0x7ff3fad19f70; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x7ff3fac3efe0>; layer = <UIWindowLayer: 0x7ff3fad19740>> | <UIView: 0x7ff3fb108b90; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7ff3fb108e60>> | | <UIScrollView: 0x7ff3fac3acf0; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7ff3fb107320>; layer = <CALayer: 0x7ff3fac18e00>; contentOffset: {0, 0}; contentSize: {960, 568}> | | | <UIView: 0x7ff3fac41ed0; frame = (640 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7ff3fac28a00>> | | | <UIView: 0x7ff3fac42320; frame = (320 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7ff3fac38e10>> | | | <UIView: 0x7ff3fac42730; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7ff3fac42810>> | | | <UIImageView: 0x7ff3faf020f0; frame = (0 564.5; 320 3.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x7ff3fae0df80>> | | | <UIImageView: 0x7ff3fac1c660; frame = (316.5 0; 3.5 568); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x7ff3fac39420>> | | <_UILayoutGuide: 0x7ff3fb108ec0; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x7ff3fb1091e0>> | | <_UILayoutGuide: 0x7ff3fb109c20; frame = (0 568; 0 0); hidden = YES; layer = <CALayer: 0x7ff3fb109d00>> 

当我使用你的代码,运行应用程序,并暂停应用程序,并查看视图层次结构,我看到以下内容:

 (lldb) po [[UIWindow keyWindow] recursiveDescription] <UIWindow: 0x156bdc30; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x156be750>; layer = <UIWindowLayer: 0x156aa3c0>> | <UIView: 0x156c5440; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x156c55c0>> | | <UIScrollView: 0x156c2740; frame = (0 0; 0 568); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x156c4d00>; layer = <CALayer: 0x156c2a80>; contentOffset: {0, 0}; contentSize: {960, 568}> | | | <UIView: 0x156c6df0; frame = (640 0; 0 536); autoresize = W+H; layer = <CALayer: 0x156c6d80>> | | | <UIView: 0x156c7100; frame = (320 0; 0 536); autoresize = W+H; layer = <CALayer: 0x156c70a0>> | | | <UIView: 0x156c73f0; frame = (0 0; 0 536); autoresize = W+H; layer = <CALayer: 0x156c7390>> | | | <UIImageView: 0x156c8bd0; frame = (0 564.5; 600 3.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x156c8c50>> | | | <UIImageView: 0x156c9020; frame = (-3.5 32; 3.5 568); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x156c90a0>> | | <_UILayoutGuide: 0x156c5620; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x156c5800>> | | <_UILayoutGuide: 0x156c5c90; frame = (0 568; 0 0); hidden = YES; layer = <CALayer: 0x156c5d10>> 

如果你没有看到你的子视图,那么可能的罪魁祸首包括:

  • 您可能没有在场景中指定视图控制器基类,因此此代码未运行。 你可以用这个viewDidLoadprintln日志语句或断点来确认,并确保你正在执行这个例程。

  • 你可能没有钩住@IBOutletscrollView ,因此scrollViewnil 。 通过在viewDidLoad放置断点并检查scrollView属性来确认这一点。


在您修改的问题中,我们现在可以看到三个子视图存在并且似乎是正确的大小。 那很棒。

现在的问题是为什么你什么都看不到。 如果在故事板中将这些定义为场景,则应该:

  • 确保为这三个子场景中的每一个定义了“基类”和“故事板标识符”; 和

  • 当您的主视图控制器实例化三个子视图控制器时,您将使用故事板标识符从故事板实例化它们(在我的示例中,我分别使用了故事板标识符ABC ):

     let Avc = storyboard.instantiateViewControllerWithIdentifier("A") as AViewController let Bvc = storyboard.instantiateViewControllerWithIdentifier("B") as BViewController let Cvc = storyboard.instantiateViewControllerWithIdentifier("C") as CViewController 

如果你这样做,并重复recursiveDescription你应该看到你的场景的子视图(例如你添加的标签)出现在输出。

使用下面的扩展名添加ChildviewController创build文件Extensions.swift复制下面的代码

  import UIKit extension UIViewController { func configureChildViewController(childController: UIViewController, onView: UIView?) { var holderView = self.view if let onView = onView { holderView = onView } addChildViewController(childController) holderView.addSubview(childController.view) constrainViewEqual(holderView, view: childController.view) childController.didMoveToParentViewController(self) } func constrainViewEqual(holderView: UIView, view: UIView) { view.translatesAutoresizingMaskIntoConstraints = false //pin 100 points from the top of the super let pinTop = NSLayoutConstraint(item: view, attribute: .Top, relatedBy: .Equal, toItem: holderView, attribute: .Top, multiplier: 1.0, constant: 0) let pinBottom = NSLayoutConstraint(item: view, attribute: .Bottom, relatedBy: .Equal, toItem: holderView, attribute: .Bottom, multiplier: 1.0, constant: 0) let pinLeft = NSLayoutConstraint(item: view, attribute: .Left, relatedBy: .Equal, toItem: holderView, attribute: .Left, multiplier: 1.0, constant: 0) let pinRight = NSLayoutConstraint(item: view, attribute: .Right, relatedBy: .Equal, toItem: holderView, attribute: .Right, multiplier: 1.0, constant: 0) holderView.addConstraints([pinTop, pinBottom, pinLeft, pinRight]) } } 

用户视图控制器

  import UIKit class MyViewControler:UIViewControler { @IBOutlet weak var myView: UIView! override func viewDidLoad() { super.viewDidLoad() let demoViewInstance = storyboard!.instantiateViewControllerWithIdentifier("youChiledViewController_Id") as! childViewController configureChildViewController(demoViewInstance, onView: myView) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }