Comment supprimer tous les sous-vues D'une vue dans Swift?
je suis à la recherche d'une méthode simple pour supprimer à la fois tous les sous-Fichiers d'une superview au lieu de les supprimer 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 rate?
mise à JOUR
mon application a un main container_view
. Je dois ajouter d'autres vues différentes comme des sous-vues de container_view
afin de fournir une sorte de navigation.
si, en cliquant sur le bouton pour "ouvrir" un page particulière, je dois supprimer allsubviews et ajouter le nouveau.
mise à JOUR 2 - UNE solution de travail (OS X)
je suppose Qu'Apple l'a réparé.
maintenant, c'est plus facile que jamais, il suffit d'appeler:
for view in containerView.subviews{
view.removeFromSuperview()
}
18 réponses
EDIT: (merci Jérémie / Rollo)
de loin, la meilleure façon de le faire dans Swift pour iOS est:
view.subviews.forEach({ "151900920".removeFromSuperview() }) // this gets things done
view.subviews.map({ "151900920".removeFromSuperview() }) // this returns modified array
^ ^ ces caractéristiques sont amusantes!
let funTimes = ["Awesome","Crazy","WTF"]
extension String {
func readIt() {
print(self)
}
}
funTimes.forEach({ "151910920".readIt() })
//// FIN DE LA MODIFIER
faites Simplement ceci:
for view in self.view.subviews {
view.removeFromSuperview()
}
ou si vous recherchez une classe spécifique
for view:CustomViewClass! in self.view.subviews {
if view.isKindOfClass(CustomViewClass) {
view.doClassThing()
}
}
Pour iOS/Swift, de se débarrasser de tous les sous-vues-je utiliser:
for v in view.subviews{
v.removeFromSuperview()
}
pour se débarrasser de toutes les sous-vues d'une classe particulière (comme UILabel) j'utilise:
for v in view.subviews{
if v is UILabel{
v.removeFromSuperview()
}
}
le code peut être écrit plus simplement comme suit.
view.subviews.forEach { "151900920".removeFromSuperview() }
cela devrait être la solution la plus simple.
let container_view: NSView = ...
container_view.subviews = []
(voir Supprimer tous les sous-vues? pour les autres méthodes)
Note Ceci est une MacOS question et cette réponse ne fonctionne que pour MacOS . Il ne fonctionne pas sur iOS.
Je ne sais pas si vous avez réussi à résoudre ce problème mais j'ai récemment connu un problème similaire où la boucle For a laissé une vue à chaque fois. J'ai découvert que c'était à cause du moi.subviews a été muté (peut-être) lorsque le removeFromSuperview() a été appelé.
pour corriger cela j'ai fait:
let subViews: Array = self.subviews.copy()
for (var subview: NSView!) in subViews
{
subview.removeFromSuperview()
}
en faisant .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 le tableau copié (subViews) contient toutes les références aux objets et n'est pas muté.
modifier: dans votre cas, je pense que vous utiliseriez:
let theSubviews: Array = container_view.subviews.copy()
for (var view: NSView!) in theSubviews
{
view.removeFromSuperview()
}
essayez ceci:
for view in container_view.subviews {
view.removeFromSuperview()
}
Extension pour supprimer tous les fichiers, il est rapidement supprimé.
import Foundation
import UIKit
extension UIView {
/// Remove allSubView in view
func removeAllSubViews() {
self.subviews.forEach({ "151900920".removeFromSuperview() })
}
}
essayez ceci:
var subViews = parentView.subviews as Array<UIView>
for someView in subViews
{
someView.removeFromSuperview()
}
UPDATE : si vous vous sentez aventureux, alors vous pouvez faire une extension sur L'uivi comme indiqué ci-dessous:
extension UIView
{
func removeAllSubViews()
{
for subView :AnyObject in self.subviews
{
subView.removeFromSuperview()
}
}
}
et appelez ça comme ça:
parentView.removeAllSubViews()
Dans xcodebeta6 cela a fonctionné.
var subViews = self.parentView.subviews
for subview in subViews as [UIView] {
subview.removeFromSuperview()
}
j'ai écrit cette extension:
extension UIView {
func lf_removeAllSubviews() {
for view in self.subviews {
view.removeFromSuperview()
}
}
}
pour que vous puissiez vous servir de vous-même.vue.lf_removeAllSubviews dans un UIViewController. Je vais mettre ça dans la version swift de mon https://github.com/superarts/LFramework plus tard, quand j'ai plus d'expérience dans swift (1 jour exp jusqu'à présent, et oui, pour API j'ai abandonné le soulignement).
votre syntaxe est légèrement off. Assurez-vous que vous avez exprimés de manière explicite.
let theSubviews : Array<NSView> = container_view.subviews as Array<NSView>
for view in theSubviews {
view.removeFromSuperview()
}
vous devez essayer ce
func clearAllScrollSubView ()
{
let theSubviews = itemsScrollView.subviews
for (var view) in theSubviews
{
if view is UIView
{
view.removeFromSuperview()
}
}
}
Swift 3
si vous ajoutez une balise à votre vue, vous pouvez supprimer une vue spécifique.
for v in (view?.subviews)!
{
if v.tag == 321
{
v.removeFromSuperview()
}
}
pour supprimer des sous - vues d'une classe spécifique-c'était le seul code Swift qui fonctionnait pour moi dans Xcode6.1.1. En supposant que les seuls sous-fichiers que vous voulez supprimer sont de type UIButton ...
for subView in nameofmysuperview.subviews {
if subView.isKindOfClass(UIButton) {
subView.removeFromSuperview()
}
}
One-liner:
while(view.subviews.count > 0) {(view.subviews[0] as NSView).removeFromSuperview()}
je pense que cette approche est plus lisible que les" one-liners "utilisant map ou forEach . Main courte foreach et carte peut être difficile à comprendre, car la logique est plus abstraite.
essayez ceci, j'ai testé ceci:
let theSubviews = container_view.subviews
for subview in theSubviews {
subview.removeFromSuperview()
}
Pour Swift 3
j'ai fait comme suit parce que le simple fait de supprimer de superview n'effaçait pas les boutons du tableau.
for k in 0..<buttons.count {
buttons[k].removeFromSuperview()
}
buttons.removeAll()
avez-vous essayé quelque chose comme
for o : AnyObject in self.subviews {
if let v = o as? NSView {
v.removeFromSuperview()
}
}