Comment faire pour supprimer tous les sous-vues de vue en Swift?
Je suis à la recherche d'une méthode simple pour supprimer à la fois tous les sous-vues à partir d'un superview au lieu de les enlever un par un.
//I'm trying something like this, but is not working
let theSubviews : Array = container_view.subviews
for (view : NSView) in theSubviews {
view.removeFromSuperview(container_view)
}
Ce que je suis absent?
Mise à JOUR
Mon app est l'un des principaux container_view
. J'ai ajouter d'autres points de vue comme des sous-vues à container_view
afin de fournir une sorte de navigation.
Donc, en cliquant sur le bouton "ouvrir" une page en particulier, j'ai besoin de supprimer allsubviews et ajouter le nouveau.
Mise à JOUR 2 - UNE solution de travail (OS X)
Je suppose que Apple a corrigé cela.
Il est maintenant plus facile que jamais, il suffit d'appeler:
for view in containerView.subviews{
view.removeFromSuperview()
}
- Je tiens à souligner que @sulthan de réponse, tout enterré avec les chiffons, est le supérieur de réponse: stackoverflow.com/questions/24312760/...
- Swift 4 donne une erreur: Ne peut pas attribuer à la propriété: 'les sous-vues" est une seule propriété. 🙁
- combien de fois est-il nécessaire de répéter que cette méthode et la question est sur MacOS et pas iOS?
Vous devez vous connecter pour publier un commentaire.
EDIT: (merci Jérémie /Rollo)
De loin le meilleur moyen de le faire dans Swift pour iOS est:
^^ Ces fonctionnalités sont amusants!
////FIN DE LA MODIFIER
Viens de le faire:
Ou si vous êtes à la recherche pour une classe spécifique
result of call to 'map' is unused
, n'est pas une erreur.Array.map
dans la plupart des langues sera de retour le tableau modifié. L'équivalent de la méthode qui permet de ne pas retourner un tableau, seraitview.subviews.forEach
.for view:CustomViewClass! in self.view.subviews where view.isKindOfClass(CustomViewClass) { view.doClassThing() }
NSView
etUIView
, pourUIView
en effet, lasubviews
propriété est en lecture seule.Pour iOS/Swift, de se débarrasser de tous les sous-vues-je utiliser:
de se débarrasser de tous les sous-vues d'une classe particulière (comme UILabel) j'utilise:
Le code peut être écrit plus simple que suivant.
Ce devrait être la solution la plus simple.
(voir Supprimer tous les sous-vues? pour les autres méthodes)
Noter que ceci est une MacOS question et cette réponse ne fonctionne que pour les MacOS. Il ne fonctionne pas sur iOS.
NSView
(OS X) etUIView
(iOS).removeAllSubviews()
surUIView
. Plus facile à retenir.NSView
, pas iOS etUIView
. Seulement les gens ne se soucient pas de lire la question et balises, par conséquent, il s'est rempli avec iOS réponses.Essayez ceci:
Je ne sais pas si vous avez réussi à résoudre cela, mais j'ai récemment vécu un problème similaire où la boucle De gauche une vue à chaque fois. J'ai trouvé que c'était parce que le soi.les sous-vues a été muté (peut-être) quand le removeFromSuperview() a été appelé.
Pour corriger ce que j'ai fait:
Par la pratique .copier(), j'ai pu effectuer le retrait de chaque sous-vue, tandis que la mutation de l'auto.les sous-vues de tableau. C'est parce que la copie d'un tableau (sous-vues) contient toutes les références aux objets et n'est pas muté.
EDIT: Dans votre cas, je pense que vous serez d'utilisation:
let subViewsArray: Array = (parentView.subviews as NSArray).copy() as Array<NSView>
Extension pour supprimer tous les sous-vues, il est rapidement enlevé.
Essayez ceci:
Mise à JOUR: Si vous vous sentez aventureux, vous pouvez alors faire une extension sur le UIView comme indiqué ci-dessous:
Et de l'appeler comme ceci:
Dans xcodebeta6 cela a fonctionné.
J'ai écrit cette extension:
De sorte que vous pouvez utiliser l'auto.vue.lf_removeAllSubviews dans un UIViewController. Je vais mettre cela dans la swift version de mon https://github.com/superarts/LFramework plus tard, quand j'aurai plus d'expérience dans la swift (1 journée exp jusqu'à présent, et oui, pour l'API, j'ai abandonné trait de soulignement).
Votre syntaxe est légèrement décalé. Assurez-vous que vous avez exprimés explicitement.
for view in container.subviews as NSView[]
fonctionnera également.vous devez essayer ce
Swift 3
Si vous ajouter un tag à votre vue, vous pouvez supprimer un point de vue spécifique.
view.subviews.filter({$0.tag != 321}).forEach({$0.removeFromSuperview()})
?Pour enlever juste les sous-vues d'une classe spécifique - c'était le seul code Swift qui a fonctionné pour moi dans Xcode6.1.1.
En supposant que le seul sous-vues que vous souhaitez supprimer sont de type UIButton...
One-liner:
Je pense que cette approche est plus lisible que le "one-liners" à l'aide de carte ou forEach. Court de la main foreach et carte peut être difficile à comprendre, car la logique est plus abstrait.
Pour Swift 3
J'ai fait comme suit, car il suffit de les retirer de la superview n'a pas pour effet d'effacer les boutons de la matrice.
Essayer , j'ai testé ceci :
Pour
Swift 4.+
j'espère que ce n'est utiliser que pour vous.
Swift 5.0
J'ai créer 2 différentes méthodes pour enlever les sous-vue. Et il est beaucoup plus facile à utiliser si on les a mis dans
extension
avez-vous essayé quelque chose comme