Check if a subview is in a view

IosCocoa TouchUiviewUikit

Ios Problem Overview


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];
    }

}

Ios Solutions


Solution 1 - Ios

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()
    }
}

Solution 2 - Ios

Try this:

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

Solution 3 - Ios

    UIView *subview = ...;
    if([self.view.subviews containsObject:subview]) {
        ...
    }

Solution 4 - Ios

The Swift equivalent will look something like this:

if(!myView.isDescendantOfView(self.view)) {
	self.view.addSubview(myView)
} else {
	myView.removeFromSuperview()
}

Solution 5 - Ios

Check the superview of the subview...

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

Solution 6 - Ios

Your if condition should go like

if (!([rootView subviews] containsObject:[self popoverView])) { 
    [rootView addSubview:[self popoverView]];
} else {
    [[self popoverView] removeFromSuperview];
    
}

Solution 7 - Ios

Here we used two different views. Parent view is the view in which we are searching for descendant view and check wether added to parent view or not.

if parentView.subviews.contains(descendantView) {
   // descendant view added to the parent view.
}else{
  // descendant view not added to the parent view.
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionpmerinoView Question on Stackoverflow
Solution 1 - Iosuser866214View Answer on Stackoverflow
Solution 2 - IosMark GranoffView Answer on Stackoverflow
Solution 3 - IosMichael FrederickView Answer on Stackoverflow
Solution 4 - IosJaySHView Answer on Stackoverflow
Solution 5 - IosJason HarwigView Answer on Stackoverflow
Solution 6 - IosSaranView Answer on Stackoverflow
Solution 7 - IosshubhamView Answer on Stackoverflow