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()
}
123
demandé sur Cristik 2014-06-19 21:26:22

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()
        }
    }
254
répondu Bseaborn 2016-01-27 05:04:16

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()
   }
}
27
répondu tonethar 2015-02-14 13:43:10

le code peut être écrit plus simplement comme suit.

view.subviews.forEach { "151900920".removeFromSuperview() }
23
répondu mishimay 2015-11-24 07:14:59

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.

14
répondu Sulthan 2018-03-08 11:04:35

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()
}
9
répondu Adam Richards 2014-07-31 19:50:21

essayez ceci:

for view in container_view.subviews {
    view.removeFromSuperview()
}
8
répondu MattL 2014-06-19 18:06:26

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() })
    }

}
7
répondu YannickSteph 2017-11-06 15:28:16

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()
6
répondu azamsharp 2014-06-19 18:52:50

Dans xcodebeta6 cela a fonctionné.

    var subViews = self.parentView.subviews
    for subview in subViews as [UIView]   {
        subview.removeFromSuperview()
    }
5
répondu hatebyte 2018-06-20 07:16:51

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).

3
répondu superarts.org 2014-09-15 07:37:48

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()
 }
2
répondu Jack 2014-06-19 18:10:21

vous devez essayer ce

func clearAllScrollSubView ()
{
    let theSubviews = itemsScrollView.subviews

    for (var view) in theSubviews
    {

        if view is UIView
        {
            view.removeFromSuperview()
        }

    }
}
2
répondu Ahmed Zaytoun 2014-11-25 00:41:26

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()
    }
 }
2
répondu uplearnedu.com 2017-08-19 02:13:46

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()
    }
}
1
répondu gammachill 2015-03-05 21:55:13

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.

1
répondu eonist 2016-02-10 06:28:51

essayez ceci, j'ai testé ceci:

  let theSubviews = container_view.subviews
  for subview in theSubviews {
      subview.removeFromSuperview()
  }
1
répondu Ezimet 2018-07-13 10:24:18

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()
0
répondu Hope 2017-03-22 04:48:20

avez-vous essayé quelque chose comme

for o : AnyObject in self.subviews {
     if let v = o as? NSView {
         v.removeFromSuperview()
     }
}
-2
répondu Christian Dietrich 2014-06-19 17:33:56