100 votes

Vérifier si une sous-vue est dans une vue

Je crée une application où j'ajoute une sous-vue à une vue en utilisant addSubview: sur un IBAction . De la même manière, lorsque le bouton avec cette IBAction est touché à nouveau doit appeler removeFromSuperview sur cette sous-vue ajoutée sur cette IBAction :

CODE PSEUDO

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

}

277voto

Vous recherchez probablement la fonction de UIView -(BOOL)isDescendantOfView:(UIView *)view; pris en charge Référence de la classe UIView .

Valeur de retour OUI si le destinataire est immédiat ou éloigné immédiate ou distante de la vue ou si la vue est le récepteur lui-même ; sinon, NON.

Vous obtiendrez un code du type :

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

19voto

MarkGranoff Points 12142

Essayez ça :

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

0 votes

Génial ! parfois il faut myView.view.superview, mais ça a marché comme par magie pour moi. Merci @MarkGranoff

11voto

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

0 votes

Ça ne marche pas, ça ajoute juste la vue par-dessus. Je vais éditer le code pour montrer le cas réel - zad0xsis 1 min ago edit

12 votes

@pmerino Félicitations pour avoir été si paresseux que vous avez également copié "zad0xsis 1 min ago edit" :-)

0 votes

Pour être honnête, je pense que cette solution est plus coûteuse que les autres car elle doit itérer à travers toutes les sous-vues.

4voto

JaySH Points 464

L'équivalent en Swift ressemblera à quelque chose comme ceci :

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

2voto

Jason Harwig Points 9925

Vérifiez la vue supérieure de la vue secondaire...

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X