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.