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. UIView
s précédemment présents ont également disparu. Que se passe-t-il?
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.
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.
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
}
}
Swift 3.0:
let viewToRemove = mySuperView.viewWithTag(myTag)
viewToRemove?.removeFromSuperview()
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() }
}
}
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.
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?
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