Add child view controller to current view controller

后端 未结 5 1370
梦毁少年i
梦毁少年i 2020-11-28 11:10

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         


        
相关标签:
5条回答
  • 2020-11-28 11:49

    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:

    • Storyboard name is "Main".
    • View controller identifier in the storyboard is named "LOGIN".
    • This uses a storyboard to create load the view controller, but the same can be done programmatically. Just make sure the view is loaded into memory before you try and access the view's frame or you will get a crash (do something like present the view controller modally).
    0 讨论(0)
  • 2020-11-28 11:51

    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.

    0 讨论(0)
  • 2020-11-28 11:54
    • Configuring a Container in Interface Builder.

    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.

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

    1. Call the 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.
    2. Add the child’s root view to your container’s view hierarchy. Always remember to set the size and position of the child’s frame as part of this process.
    3. Add any constraints for managing the size and position of the child’s root view.
    4. Call the didMoveToParentViewController: method 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.

    0 讨论(0)
  • 2020-11-28 11:56

    didMoveToParentViewController must be the last.

    0 讨论(0)
  • 2020-11-28 11:58

    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)

    0 讨论(0)
提交回复
热议问题