添加子视图控制器swift [英] Add child view controller swift

查看:151
本文介绍了添加子视图控制器swift的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



孩子是:

  AViewController 
BViewController
CViewController

但是当我启动应用程序时,我可以滑动屏幕,有3部分滑动,但A,B,C视图控制器不出现..



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

  import UIKit 

类ContainerViewController:UIViewController {

@IBOutlet var scrollView:UIScrollView!

override func viewDidLoad(){
super.viewDidLoad()
//加载视图之后进行任何其他设置,通常来自nib。


//创建VC

var Avc:AViewController = AViewController()
var Bvc:BViewController = BViewController()
var Cvc :CViewController = CViewController()



//将其添加到视图层次结构


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)

//设置框架

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

//设置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);自动尺寸= 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>

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




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


  • 您可能没有为 scrollView连接 @IBOutlet ,因此 scrollView nil 。通过将断点放在 viewDidLoad 中并检查 scrollView 属性来确认。







在修改过的问题中,我们现在可以看到三个子视图呈现的大小正确。太棒了。



现在的问题是为什么你看不到任何东西。如果你在脚本中定义为场景,你应该:




  • 确保基类标识符是为这三个子场景中的每一个定义的;和


  • 当你的主视图控制器实例化三个子视图控制器时,你将使用storyboard标识符从storyboard实例化它们(在我的例子中,标识符 A B C

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




    • 如果您执行上述操作并重复 recursiveDescription ,您应该会看到场景的子视图(例如您添加的标签)输出。


      I m trying to add child view controller to a containerViewController

      Child are :

      AViewController
      BViewController
      CViewController
      

      I have no error but when i launch the app, i can swipe the screen, there is 3 section swiped but the A,B,C view controllers don't appeared..

      This is my code, any idea ?

      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)
      
      
      }
      

      Edit:

      Looking at the view hierarchy, it reports the following:

      <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>>
      

      解决方案

      When I use your code, run the app, and pause the app, and look at the view hierarchy, I see the following:

      (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>>
      

      If you're not seeing your subviews there, then likely culprits include:

      • You may not have specified the view controller base class in your scene, and thus this code isn't being run. You can confirm this with a println log statement or breakpoint in side this viewDidLoad and make sure you're hitting this routine.

      • You may not have hooked up the @IBOutlet for the scrollView, and thus scrollView is nil. Confirm this by putting breakpoint in viewDidLoad and examining the scrollView property.


      In your revised question, we can now see that the three subviews are present and appear to be the correct size. That's great.

      Now the question is why you don't see anything. If you have these defined as scenes in your storyboard, you should:

      • Make sure the "base class" and the "storyboard identifier" is defined for each of these three child scenes; and

      • When your main view controller instantiates the three child view controllers, you would instantiate them from the storyboard using the storyboard identifier (in my example, I used storyboard identifiers of A, B, and C, respectively):

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

      If you do the above and repeat the recursiveDescription you should see your scene's subviews (e.g. the labels you added) appear in the output.

      这篇关于添加子视图控制器swift的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆