web-dev-qa-db-fra.com

Quelle est la bonne façon de supprimer une sous-vue d'une hiérarchie de vues et de la supprimer?

J'ai un parent UIView avec un certain nombre de sous-vues. Périodiquement, je dois supprimer une sous-vue et la supprimer complètement du système. Quelle est la bonne façon de faire cela? J'ai essayé ceci:

UIView *v = [self.containerView viewWithTag:[n integerValue]];

[v removeFromSuperview];

et obtenu un résultat bizarre. UIViews précédemment présents ont également disparu. Que se passe-t-il?

37
dugla

Essaye ça:

UIView *v = [self.containerView viewWithTag:[n integerValue]];
v.hidden = YES;
[self.containerView bringSubviewToFront:v];
[v removeFromSuperview];

Une autre chose que je viens de remarquer dans le document de classe UIView - voir la dernière phrase:

removeFromSuperview Déconnecte le récepteur de sa vue d'ensemble et de sa fenêtre et le supprime de la chaîne de répondeurs.

  • (void) removeFromSuperview

Discussion Si la vue du récepteur n’est pas nulle, cette méthode libère le récepteur. Si vous envisagez de réutiliser la vue, veillez à la conserver avant d'appeler cette méthode et veillez à la publier comme il convient lorsque vous avez terminé ou après l'avoir ajoutée à une autre hiérarchie de vues.

Ne jamais invoquer cette méthode lors de l'affichage.

MISE À JOUR: Nous sommes en 2014 et la suppression d'une sous-vue sans cacher se passe parfaitement bien. Le code de l'affiche originale devrait fonctionner tel quel:

UIView *v = [self.containerView viewWithTag:[n integerValue]];
[v removeFromSuperview];

Cela supprimera v et toutes les vues associées à celle-ci en tant que sous-vues, laissant derrière conteneurView et tous les frères et sœurs de v.

68
mahboudz

Pour supprimer toutes les sous-vues de votre vue:

for(UIView *subview in [view subviews]) {
   [subview removeFromSuperview];
}

Si vous souhaitez supprimer uniquement une vue spécifique, procédez comme suit:

for(UIView *subview in [view subviews]) {
  if([subview isKindOfClass:[UIButton class]]) {
     [subview removeFromSuperview];
 } else {
     // Do nothing - not a UIButton or subclass instance
 }
}

Vous pouvez également supprimer des sous-vues par valeur de balise:

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
    }
}
38
iKushal

Swift 3.0:

let viewToRemove = mySuperView.viewWithTag(myTag)
viewToRemove?.removeFromSuperview()
1
Alexey

Swift 4: étendre UIView

extension UIView {
    public func removeAllSubviews() {
        for subview in self.subviews {
            subview.removeFromSuperview()
        }
    }
}

ou

extension UIView {
    public func removeAllSubviews() {
        self.subviews.forEach { $0.removeFromSuperview() }
    }
}
0
JonJ

Est-il possible que cell.contentView ait la même balise que la sous-vue que vous souhaitez supprimer? selon la documentation viewWithTag supprime:

La vue dans la hiérarchie du destinataire qui correspond à la balise. Le récepteur est inclus dans la recherche.

Si tel est le cas, vous pouvez peut-être supprimer par inadvertance cell.contentView de la cellule. Si n est égal à zéro et que le contenu de votre cellule n'a pas de balise définie, la valeur par défaut est 0 et cela se produit.

0
Kevlar

Sont-ils simplement en train de disparaître de l'affichage ou de l'écran et la hiérarchie des vues? Qu'est-ce que le débogueur vous montre?

0
NSResponder

C'est la bonne idée générale. ces autres UIViews qui disparaissent, quelle est leur relation avec cette UIView? Sont-ils des sous-vues de cette vue? Sont-ils désalloués dans la méthode dealloc de la vue que vous supprimez?

Êtes-vous sûr que vos tags sont uniques?

Sujal

0
sujal