web-dev-qa-db-fra.com

UIView: Comment savoir si une vue existe déjà?

Je me demandais comment savoir si une sous-vue (dans mon cas pageShadowView) avait déjà été ajoutée à ma vue.

Je suis venu avec cela, mais cela ne fonctionne pas vraiment:

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

En outre, je suis toujours confus au sujet de la chose de soi. Je sais que cela consiste à préciser que nous parlons de la vue du ViewController actuel ... mais j'en ai vraiment besoin si (1) il n'y a pas d'autres ViewControllers ou (2) si cela n'a pas d'importance parce que si je voulais jamais faire référence à un autre viewController, je m'assurerais de l'appeler?

Je suis désolé si tout cela est très basique, mais je vous serais très reconnaissant de vos commentaires.

23
n.evermind

Ici:

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

Et oui, vous avez besoin de cette self. Il n'y a pas de "vue" ivar explicite sur UIViewController. L'instruction self.view est en fait un appel à la méthode [self view] qui est un getter pour la vue de UIViewController.

84

Donnez-lui une étiquette unique: view.tag = UNIQUE_TAG, puis vérifiez l'existence de la vue du conteneur:

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

vous pouvez trouver une vue secondaire comme celle-ci

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

Il existe un autre moyen de rechercher, dans Swift : isDescendant(of view: UIView) -> Bool ou dans Obj-C : - (BOOL)isDescendantOfView:(UIView *)view

Rapide :

    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
Hemang

Pour ajouter à ce qui a été dit, vous pouvez faire ce qui suit. Si vous définissez votre 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)
1
user3344717

ajouter une valeur de conservation de la vue 

puis vérifiez la valeur de conserver 

si> 1, alors existe, si parfait devrait être 2 

puis relâchez-le une fois 

0
chings228

Swift VERSION:

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