n.evermind
n.evermind

Reputation: 12004

UIView: How to find out if a view is already exists?

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.

Upvotes: 25

Views: 38093

Answers (8)

Muhammad Ahmad
Muhammad Ahmad

Reputation: 398

best and easy way to find that your view is exist or not , there are many way like you check a view is contain or not in super view or just view some time this method is failed because if the Uiview is already remove then error occur, so code is here : here errorView is my UiView

 errorView.tag = 333

 if ( self.view?.viewWithTag(333) != nil ){
    print("contain")
 }

 else {
    print("not contain")
 }

Upvotes: 2

Hemang
Hemang

Reputation: 27072

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.
        myView.removeFromSuperview()
    } else {
        //myView is not subview of self.view, add it.
        self.view.addSubview(myView)
    }

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

Upvotes: 7

Dave Levy
Dave Levy

Reputation: 1192

SWIFT VERSION:

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

Upvotes: 2

user3344717
user3344717

Reputation: 161

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)

Upvotes: 1

saadnib
saadnib

Reputation: 11145

you can find a sub view like this

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

Upvotes: 8

Bartosz Ciechanowski
Bartosz Ciechanowski

Reputation: 10333

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.

Upvotes: 84

chings228
chings228

Reputation: 1889

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

Upvotes: 0

coneybeare
coneybeare

Reputation: 33101

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

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

Upvotes: 25

Related Questions