I have a parent UIView with a number of subviews. Periodically I need to remove a subview and completely remove it from the system. What is the correct way to do this? I tried this:
UIView *v = [self.containerView viewWithTag:[n integerValue]]; [v removeFromSuperview];
and got a bizarre result. Previously present UIView
s disappeared as well. What's going on?
[someNSView setSubviews:[NSArray array]]; For UIView (iOS development only), you can safely use makeObjectsPerformSelector: because the subviews property will return a copy of the array of subviews: [[someUIView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
If you add a tag to your view you can remove a specific view.
Try this:
UIView *v = [self.containerView viewWithTag:[n integerValue]]; v.hidden = YES; [self.containerView bringSubviewToFront:v]; [v removeFromSuperview];
Another thing I just noticed from the UIView class document - see the last sentence:
removeFromSuperview Unlinks the receiver from its superview and its window, and removes it from the responder chain.
Discussion If the receiver’s superview is not nil, this method releases the receiver. If you plan to reuse the view, be sure to retain it before calling this method and be sure to release it as appropriate when you are done with it or after adding it to another view hierarchy.
Never invoke this method while displaying.
UPDATE: It is now 2014 and removing a subview without hiding it works perfectly fine. The original poster's code should work as-is:
UIView *v = [self.containerView viewWithTag:[n integerValue]]; [v removeFromSuperview];
This will remove v and any views it has attached to it as subviews, leaving behind containerView and any siblings of v.
To remove all subviews from your view:
for(UIView *subview in [view subviews]) { [subview removeFromSuperview]; }
If you want to remove some specific view only then:
for(UIView *subview in [view subviews]) { if([subview isKindOfClass:[UIButton class]]) { [subview removeFromSuperview]; } else { // Do nothing - not a UIButton or subclass instance } }
You can also delete sub views by tag value:
for(UIView *subview in [view subviews]) { if(subview.tag==/*your subview tag value here*/) { [subview removeFromSuperview]; } else { // Do nothing - not a UIButton or subclass instance } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With