UIView: How to find out if a view is already exist

2019-03-09 19:08发布

问题:

I was wondering how to find out if a subview (in my case pageShadowView) has already been added to my view.

I've come up with this, but it doesn't really work:

if ([pageShadowView isKindOfClass:[self.view class]]) {
        [self.view addSubview:pageShadowView];
    }

Also, I'm still confused about the self.-thing. I know that this has to do with making clear that we are talking about the view of the current ViewController ... but do I really need it if there (1) are no other ViewControllers or (2) if it doesn't really matter because if I ever wanted to refer to another viewController, I'd make sure to call it?

I'm sorry if this is all very basic, but I'd be very grateful for your comments.

回答1:

Here:

BOOL doesContain = [self.view.subviews containsObject:pageShadowView];

And yes, you need this self. There is no explicit ivar "view" on UIViewController. The self.view statement is actually a call on method [self view] which is a getter for UIViewController's view.



回答2:

Give it a unique tag: view.tag = UNIQUE_TAG, then check the container view for existence:

BOOL alreadyAdded = [containerView viewWithTag:UNIQUE_TAG] != nil;


回答3:

you can find a sub view like this

for(UIView *view in self.view.subviews)
{
    if([view isKindOfClass:[UIView class]])
    {
        //here do your work
    }
}


回答4:

There's one more way to find, in Swift: isDescendant(of view: UIView) -> Bool or in Obj-C: - (BOOL)isDescendantOfView:(UIView *)view

Swift:

    if myView.isDescendant(of: self.view) {
        //myView is subview of self.view, remove it.
        self.view.addSubview(myView)
    } else {
        //myView is not subview of self.view, add it.
        myView.removeFromSuperview()
    }

Obj-C:

if([myView isDescendantOfView:self.view]) {   
    //myView is subview of self.view, remove it.
    [myView removeFromSuperView];
} else {
    //myView is not subview of self.view, add it.
    [self.view addSubView:myView];
}


回答5:

To add to what coneybeare said, you could do the following. If you set your object.tag=100;

           if ([self.view.superview viewWithTag:100] == nil){ //if statement executes if the object with tag 100 in view.superview is absent (nil)

           if ([self.view viewWithTag:100] == nil){ //if statement executes if the object with tag 100 in view (not superview) is absent (nil)


回答6:

add a retain value of the view

then check the retain value

if > 1 , then exist , if perfect should be 2

then release it once



回答7:

SWIFT VERSION:

let doesContain = self.view?.subviews.contains(pageShadowView)