Search code examples
iosswiftchildviewcontroller

UITableViewController as dropdown?


I would like to create a UITableViewController as a dropdown on clicking a UIButton.

I have created one using addChildViewController but I cannot remove it by clicking the button a second time.

The code I used:

var flag = 0
func filter(sender: UIButton){
 let _viewController = storyboard!.instantiateViewControllerWithIdentifier("UserViewController") as! UserViewController
 if(flag == 1){
            _viewController.willMoveToParentViewController(nil)
            _viewController.removeFromParentViewController()

        flag = 0
        return
    }

    addChildViewController(_viewController)
    _viewController.view.frame.origin.y = filterButton.frame.maxY
    _viewController.view.frame.origin.x = self.view.frame.size.width-250
    _viewController.view.frame.size.width = 250
    _viewController.view.frame.size.height = 500 
    self.view.addSubview(_viewController.view)
    flag = 1
}

Solution

  • Your case is simple because you are instantiating the view controller everytime you click the button. You should instantiate the _viewController in viewDidLoad. Also you must remove the view from superview on removing and make the self as parent on adding.

    Refer this link for detail How is a parent view controller notified that is's child view controller has removed itself?. Your code should look like the following,

    var _viewController:UITableViewController!
    var flag = 0
    func filter(sender: UIButton){
    
        if(flag == 1){
            _viewController.willMoveToParentViewController(nil)
            _viewController.view.removeFromSuperview() 
            _viewController.removeFromParentViewController()
            flag = 0
            return
        }
    
        addChildViewController(_viewController)
        _viewController.view.frame.origin.y = filterButton.frame.maxY
        _viewController.view.frame.origin.x = self.view.frame.size.width-250
        _viewController.view.frame.size.width = 250
        _viewController.view.frame.size.height = 500
        self.view.addSubview(_viewController.view)
        _viewController.didMoveToParentViewController(self)
        flag = 1
    
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        _viewController = storyboard!.instantiateViewControllerWithIdentifier("UserViewController") as! UserViewController
    
    }