web-dev-qa-db-fra.com

Comment supprimer toutes les sous-vues d'une vue dans Swift?

Je cherche une méthode simple pour supprimer immédiatement toutes les sous-vues d'un aperçu au lieu de les supprimer une par une.

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

Qu'est-ce qui me manque?

METTRE À JOUR

Mon application a un container_view principal. Je dois ajouter d'autres vues en tant que vues secondaires à container_view afin de fournir une sorte de navigation.

Ainsi, lorsque vous cliquez sur le bouton pour "ouvrir" une page particulière, je dois supprimer toutes les vues et en ajouter une nouvelle.

UPDATE 2 - Une solution opérationnelle (OS X)

Je suppose que Apple l'a corrigé.

Maintenant, c'est plus facile que jamais, il suffit d'appeler: 

for view in containerView.subviews{
    view.removeFromSuperview()
}
132
Alberto Bellini

EDIT: (merci Jérémie/Rollo)

De loin, le meilleur moyen de faire cela dans Swift pour iOS est:

view.subviews.forEach({ $0.removeFromSuperview() }) // this gets things done
view.subviews.map({ $0.removeFromSuperview() }) // this returns modified array

^^ Ces fonctionnalités sont amusantes!

let funTimes = ["Awesome","Crazy","WTF"]
extension String { 
    func readIt() {
        print(self)
    }
}

funTimes.forEach({ $0.readIt() })

//// END EDIT

Faites juste 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()
        }
    }
272
Bseaborn

Pour iOS/Swift, pour supprimer toutes les vues secondaires que j'utilise:

for v in view.subviews{
   v.removeFromSuperview()
}

pour me 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()
   }
}
31
tonethar

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

view.subviews.forEach { $0.removeFromSuperview() }
27
mishimay

Cela devrait être la solution la plus simple.

let container_view: NSView = ...
container_view.subviews = []

(voir Supprimer toutes les sous-vues? pour d'autres méthodes)


Notez qu'il s'agit d'une question MacOS et que cette réponse ne fonctionne que pour MacOS. Cela ne fonctionne pas sur iOS.

14
Sulthan

Je ne sais pas si vous avez réussi à résoudre ce problème, mais j'ai récemment rencontré un problème similaire dans lequel la boucle For laissait une vue à chaque fois. J'ai trouvé que c'était parce que l'auto-vues a été muté (peut-être) lorsque la méthode removeFromSuperview () a été appelée.

Pour résoudre ce problème, je l'ai fait:

let subViews: Array = self.subviews.copy()
for (var subview: NSView!) in subViews
{
    subview.removeFromSuperview()
}

En utilisant .copy (), je pourrais effectuer la suppression de chaque sous-vue tout en migrant le tableau self.subviews. En effet, le tableau copié (subViews) contient toutes les références aux objets et n'est pas muté.

EDIT: Dans votre cas, je pense que vous utiliseriez:

let theSubviews: Array = container_view.subviews.copy()
for (var view: NSView!) in theSubviews
{
    view.removeFromSuperview()
}
9
Adam Richards

Essaye ça:

for view in container_view.subviews {
    view.removeFromSuperview()
}
8
MattL

Extension pour supprimer toutes les sous-vues, il est rapidement supprimé.

import Foundation
import UIKit

extension UIView {
    /// Remove allSubView in view
    func removeAllSubViews() {
        self.subviews.forEach({ $0.removeFromSuperview() })
    }

}
7
YannickSteph

Essaye ça: 

var subViews = parentView.subviews as Array<UIView>

      for someView in subViews
      {
          someView.removeFromSuperview()
      }

UPDATE: Si vous vous sentez aventureux, vous pouvez créer une extension sur UIView comme indiqué ci-dessous: 

extension UIView
{
    func removeAllSubViews()
    {
       for subView :AnyObject in self.subviews
       {
            subView.removeFromSuperview()
       }
    }

}

Et appelez ça comme ça: 

parentView.removeAllSubViews()
6
azamsharp

Dans xcodebeta6 cela a fonctionné.

    var subViews = self.parentView.subviews
    for subview in subViews as [UIView]   {
        subview.removeFromSuperview()
    }
5
hatebyte

J'ai écrit cette extension:

extension UIView {
    func lf_removeAllSubviews() {
        for view in self.subviews {
            view.removeFromSuperview()
        }
    }
}

Pour que vous puissiez utiliser self.view.lf_removeAllSubviews dans un UIViewController. Je mettrai ceci dans la version Swift de mon https://github.com/superarts/LFramework plus tard, quand j’aurai plus d’expérience à Swift (1 jour d’exp à ce jour, et oui, j’ai abandonné l’API souligner).

3
superarts.org

tu dois essayer ça

func clearAllScrollSubView ()
{
    let theSubviews = itemsScrollView.subviews

    for (var view) in theSubviews
    {

        if view is UIView
        {
            view.removeFromSuperview()
        }

    }
}
2
Ahmed Zaytoun

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
uplearnedu.com

Votre syntaxe est légèrement incorrecte. Assurez-vous de lancer explicitement.

 let theSubviews : Array<NSView> = container_view.subviews as Array<NSView>
 for view in theSubviews {
     view.removeFromSuperview()
 }
2
Jack

Bon mot:

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 . Short hand foreach et map peut être difficile à comprendre, car la logique est plus abstraite. 

1
eonist

Pour supprimer uniquement les sous-vues d'une classe spécifique, il s'agissait du seul code Swift qui fonctionnait pour moi dans Xcode6.1.1 . En supposant que les seules sous-vues que vous souhaitez supprimer soient de type UIButton ...

for subView in nameofmysuperview.subviews {
    if subView.isKindOfClass(UIButton) {
        subView.removeFromSuperview()
    }
}
1
gammachill

Pour Swift 3

J'ai fait comme suit parce que simplement retirer de Superview n'a pas effacé les boutons du tableau.

    for k in 0..<buttons.count {

      buttons[k].removeFromSuperview()

    }


    buttons.removeAll()
1
Hope

Essayez ceci, j'ai testé ceci:

  let theSubviews = container_view.subviews
  for subview in theSubviews {
      subview.removeFromSuperview()
  }
1
Ezimet

Pour Swift 4.+

extension UIView {
     public func removeAllSubViews() {
          self.subviews.forEach({ $0.removeFromSuperview() })

}

j'espère que c'est une utilisation complète pour vous.

0
Masoud Heydari

Swift 5.0

Je crée 2 méthodes différentes pour supprimer des sous-vues. Et c'est beaucoup plus facile à utiliser si on les met dans extension

extension UIView {
    /// Remove all subview
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }

    /// Remove all subview with specific type
    func removeAllSubviews<T: UIView>(type: T.Type) {
        subviews
            .filter { $0.isMember(of: type) }
            .forEach { $0.removeFromSuperview() }
    }
}
0
nahung89