添加子视图控制器swift [英] Add child view controller 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 thisviewDidLoad
and make sure you're hitting this routine.You may not have hooked up the
@IBOutlet
for thescrollView
, and thusscrollView
isnil
. Confirm this by putting breakpoint inviewDidLoad
and examining thescrollView
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
, andC
, 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屋!