How to remove the ChildViewController from Parent View Controller in Swift 3

Viewed 43825

I am developing an IOS Application. I have added the UIViewController in View Pager. I want to reinitialize it when the language is changed. Here I want to remove all child UIViewController from UIViewPager and again back to add all UIViewController into Viewpager. How can I do that?

Sample Code

let viewPager = ViewPagerController()
viewPager.options = options
viewPager.dataSource = self
viewPager.delegate = self
self.addChildViewController(viewPager)

Swift 3.1

xcode 8.3.3

9 Answers
childViewControllers.forEach({
  $0.willMove(toParentViewController: nil)
  $0.view.removeFromSuperview()
  $0.removeFromParentViewController()
})

This answer is for swift 4.2 and above one is less than 4.2 versions.

children.forEach({
  $0.willMove(toParent: nil)
  $0.view.removeFromSuperview()
  $0.removeFromParent()
})

Here is the more concise version for removing all child controllers from the parent. You can use self.childViewControllers to define explicitly. As this approach, you can get rid of these extra conditions to check.

Swift 4.2 and above

create extension on UIViewController and add removeChild() method

extension UIViewController {
        
  func removeChild() {
    self.children.forEach {
      $0.willMove(toParent: nil)
      $0.view.removeFromSuperview()
      $0.removeFromParent()
    }
  }
} 

Usage:

call removeChild from parent UIViewController

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    self.removeChild()
}

To add viewController:

let forgetPasswordVc = ForgetPasswordViewController()
self.addChild(forgetPasswordVc)
self.view.addSubview(forgetPasswordVc.view)
forgetPasswordVc.didMove(toParent: self)

To remove (inside the ForgetPasswordViewController):

self.removeFromParent()
self.view.removeFromSuperview()

Swift 4.2 , XCode 10 , ios 12 , 2018 Answer

self.children.forEach{$0.willMove(toParent: nil);$0.view.removeFromSuperview();$0.removeFromParent()}

Hope it is helpful to someone

Update for Swift 4

if self.children.count > 0{
    let viewControllers:[UIViewController] = self.children
    for viewContoller in viewControllers{
        viewContoller.willMove(toParent: nil)
        viewContoller.view.removeFromSuperview()
        viewContoller.removeFromParent()
    }
}
  if self.childViewControllers.count > 0{
        let viewControllers:[UIViewController] = self.childViewControllers
        for viewContoller in viewControllers{
            viewContoller.willMove(toParentViewController: nil)
            viewContoller.view.removeFromSuperview()
            viewContoller.removeFromParentViewController()
        }
    }
  if self.childControllers.count > 0{
           let viewControllers:[UIViewController] = self.childControllers
           for viewContoller in viewControllers{
               viewContoller.willMove(toParentViewController: nil)
               viewContoller.view.removeFromSuperview()
               viewContoller.removeFromParentViewController()
           }
       }
Related