I am trying to add a child view controller in code, to the current view controller from storyboard by using the next code:
UIStoryboard *storyboard = [UIStor
Solution in Swift (Swift 4 at the time of this writing):
//load the view controller and add as child
storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
loginVC = storyboard.instantiateViewController(withIdentifier: "LOGIN")
addChildViewController(loginVC)
//make sure that the child view controller's view is the right size
loginVC.view.frame = contentView.bounds
contentView.addSubview(loginVC.view)
//you must call this at the end per Apple's documentation
loginVC.didMove(toParentViewController: self)
Notes:
why you do not try this code for adding view i think this one is simple and easy..
self.loginView = [self.storyboard instantiateViewControllerWithIdentifier:@"LOGIN"];
[self addChildViewController:self.loginView];
[self.loginView.view setFrame:CGRectMake(0.0f, 0.0f, self.contentView.frame.size.width, self.contentView.frame.size.height)];
[self.contentView addSubview:self.loginView.view];
[self.loginView didMoveToParentViewController:self];
for further more information check this link.
To create a parent-child container relationship at design time, add a container view object to your storyboard scene, as shown in image below. A container view object is a placeholder object that represents the contents of a child view controller. Use that view to size and position the child’s root view in relation to the other views in the container.
When you load a view controller with one or more container views, Interface Builder also loads the child view controllers associated with those views. The children must be instantiated at the same time as the parent so that the appropriate parent-child relationships can be created.
If you do not use Interface Builder to set up your parent-child container relationships, you must create those relationships programmatically by adding each child to the container view controller, as described in Adding a Child View Controller to Your Content.
To incorporate a child view controller into your content programmatically, create a parent-child relationship between the relevant view controllers by doing the following:
addChildViewController:
method of your container view controller.
This method tells UIKit that your container view controller is now managing the view of the child view controller.Here is the code for that.
- (void)displayContentController:(UIViewController *)content {
[self addChildViewController:content];
content.view.frame = [self frameForContentController];
[self.view addSubview:self.currentClientView];
[content didMoveToParentViewController:self];
}
Swift:
func displayContentController(_ content: UIViewController?) {
if let content = content {
addChild(content)
}
content?.view.frame = frameForContentController()
view.addSubview(currentClientView)
content?.didMove(toParent: self)
}
More detail explanation of the same example is given at Apple developer programming guide.
didMoveToParentViewController must be the last.
You can also create an extension for adding and removing UIViewController
.
extension UIViewController {
func addChildViewControllerWithView(_ childViewController: UIViewController, toView view: UIView? = nil) {
let view: UIView = view ?? self.view
childViewController.removeFromParent()
childViewController.willMove(toParent: self)
addChild(childViewController)
childViewController.didMove(toParent: self)
childViewController.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(childViewController.view)
view.addConstraints([
NSLayoutConstraint(item: childViewController.view!, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1, constant: 0),
NSLayoutConstraint(item: childViewController.view!, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0),
NSLayoutConstraint(item: childViewController.view!, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: 0),
NSLayoutConstraint(item: childViewController.view!, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: 0)
])
view.layoutIfNeeded()
}
func removeChildViewController(_ childViewController: UIViewController) {
childViewController.removeFromParent()
childViewController.willMove(toParent: nil)
childViewController.removeFromParent()
childViewController.didMove(toParent: nil)
childViewController.view.removeFromSuperview()
view.layoutIfNeeded()
}
}
Whenever you'd like to add UIViewController
in the viewDidLoad()
method you need to call addChildViewControllerWithView(someVC)