Search code examples
ioscocoa-touchuiviewuikit

Check if a subview is in a view


I'm making an app where I add a subview to a view using addSubview: on an IBAction. In the same way, when the button with that IBAction is touched again should call removeFromSuperview on that subview added on that IBAction:

PSEUDO CODE

-(IBAction)showPopup:(id)sender 
{
    System_monitorAppDelegate *delegate = (System_monitorAppDelegate *)[[UIApplication sharedApplication] delegate];
    UIView *rootView = delegate.window.rootViewController.view;

    if([self popoverView] is not on rootView) 
    { 
        [rootView addSubview:[self popoverView]];
    } 
    else 
    {
        [[self popoverView] removeFromSuperview];
    }

}

Solution

  • You are probably looking for UIView's -(BOOL)isDescendantOfView:(UIView *)view; taken in UIView class reference.

    Return Value YES if the receiver is an immediate or distant subview of view or if view is the receiver itself; otherwise NO.

    You will end up with a code like :

    Objective-C

    - (IBAction)showPopup:(id)sender {
        if(![self.myView isDescendantOfView:self.view]) { 
            [self.view addSubview:self.myView];
        } else {
            [self.myView removeFromSuperview];
        }
    }
    

    Swift 3

    @IBAction func showPopup(sender: AnyObject) {
        if !self.myView.isDescendant(of: self.view) {
            self.view.addSubview(self.myView)
        } else {
            self.myView.removeFromSuperview()
        }
    }