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()
}
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()
}
}
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()
}
}
Le code peut être écrit plus simplement comme suit.
view.subviews.forEach { $0.removeFromSuperview() }
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.
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()
}
Essaye ça:
for view in container_view.subviews {
view.removeFromSuperview()
}
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() })
}
}
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()
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 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).
tu dois essayer ça
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()
}
}
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()
}
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.
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()
}
}
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()
Essayez ceci, j'ai testé ceci:
let theSubviews = container_view.subviews
for subview in theSubviews {
subview.removeFromSuperview()
}
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.
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() }
}
}