Quelle est la meilleure façon de supprimer toutes les sous-vues de votre self.view?


87

Je pensais que quelque chose comme ça pourrait fonctionner:

    for (UIView* b in self.view.subviews)
    {
       [b removeFromSuperview];
    }

Je souhaite supprimer tout type de sous-vue. UIImages, boutons, champs de texte, etc.


1
Ça marchera. Vous devrez peut-être le faire de manière récursive si vous avez plusieurs niveaux de sous-vues ... ou peut-être pas. Je ne sais pas pourquoi vous voulez faire cela.
Dustin

Ça marche? Je pensais que bcela serait rapidement supprimé du subviewstableau, provoquant une mutation dans une boucle d'énumération rapide, ce qui est interdit.
Mazyod

2
@Mazyod vérifie la propriété des sous-vues: @property (non atomique, en lecture seule, copie) NSArray * sous-vues - il est déclaré comme copie, donc lorsque nous supprimons des sous-vues, nous ne modifions pas ce tableau (car c'est une copie).
Max

1
@Max: C'est incorrect. Le copyspécificateur signifie qu'il effectue une copie lorsqu'il est défini ; rien n'est spécifié sur l'obtention. Il est fort probable qu'une copie soit renvoyée, mais cela ne fait pas partie de la définition de la propriété.
jscs

@ W'rkncacnter d'accord, vous avez raison de dire que le mot-clé copier n'a rien à voir avec obtenir de la valeur (mais je pense que c'est implicite).
Max

Réponses:


250
[self.view.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)];

C'est identique à votre variante, mais légèrement plus courte.


Qu'en est-il sauf ceci - en utilisant la même méthode? @Mazyod
Hemang

Y a-t-il une différence (en termes de performances) entre makeObjectsPerformSelector et une boucle manuelle pour supprimer la sous-vue?
Ganpat

22
self.view.subviews.forEach({ $0.removeFromSuperview() })

Version identique dans Swift.


7

Rapide:

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

2

Vous pouvez utiliser comme ça

//adding an object to the view
view.addSubView(UIButton())

// you can remove any UIControls you have added with this code
view.subviews.forEach { (item) in
     item.removeFromSuperview()
}

vue est la vue dont vous souhaitez tout supprimer. vous supprimez simplement chaque sous-vue en faisant forEach


Pouvez-vous développer votre réponse?
DᴀʀᴛʜVᴀᴅᴇʀ

N'est-ce pas en train de muter une collection en l'itérant?
mixtly87

0

Pour Swift 4 + .Vous pouvez faire une extension à UIView. Appelez-le chaque fois que nécessaire.

extension UIView {
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.