我正在尝试将子视图控制器添加到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>>
答案 0 :(得分:5)
使用以下扩展程序添加ChildviewController 创建文件Extensions.swift copy bellow code
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: holderView!, view: childController.view)
childController.didMove(toParentViewController: 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!.instantiateViewController(withIdentifier: "youChiledViewController_Id") as! childViewController
configureChildViewController(childController: demoViewInstance, onView: myView)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
答案 1 :(得分:3)
当我使用您的代码,运行应用程序并暂停应用程序,并查看视图层次结构时,我看到以下内容:
(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>>
如果您没有在那里看到您的子视图,那么可能的罪魁祸首包括:
您可能没有在场景中指定视图控制器基类,因此未运行此代码。您可以使用此println
旁边的viewDidLoad
日志语句或断点进行确认,并确保您正在执行此例程。
您可能没有为@IBOutlet
添加scrollView
,因此scrollView
为nil
。通过在viewDidLoad
中放置断点并检查scrollView
属性来确认这一点。
在您修改过的问题中,我们现在可以看到三个子视图存在并且看起来是正确的大小。那很好。
现在的问题是为什么你什么也看不见。如果您在故事板中将这些定义为场景,则应该:
确保为这三个子场景中的每一个定义“基类”和“故事板标识符”;和
当您的主视图控制器实例化三个子视图控制器时,您将使用故事板标识符从故事板中实例化它们(在我的示例中,我使用了A
,B
的故事板标识符,分别为C
:
let Avc = storyboard.instantiateViewControllerWithIdentifier("A") as AViewController
let Bvc = storyboard.instantiateViewControllerWithIdentifier("B") as BViewController
let Cvc = storyboard.instantiateViewControllerWithIdentifier("C") as CViewController
如果您执行上述操作并重复recursiveDescription
,则会看到您的场景的子视图(例如您添加的标签)出现在输出中。