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.

dgund
la source
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.

Max
la source
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.

lcl
la source
7

Rapide:

extension UIView {
    func removeAllSubviews() {
        for subview in subviews {
            subview.removeFromSuperview()
        }
    }
}
mixel
la source
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

pointe
la source
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() }
    }
}
ishwardgret
la source