it-swarm.com.de

Wie entferne ich alle Unteransichten einer Ansicht in Swift?

Ich suche nach einer einfachen Methode, um alle Unteransichten auf einmal aus einem Superview zu entfernen, anstatt sie nacheinander zu entfernen.

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

Was fehlt mir?

UPDATE

Meine App verfügt über einen container_view. Ich muss verschiedene andere Ansichten als Unteransichten zu container_view hinzufügen, um eine Art Navigation bereitzustellen.

Wenn Sie also auf die Schaltfläche klicken, um eine bestimmte Seite zu "öffnen", muss ich alle Unteransichten entfernen und die neue hinzufügen.

UPDATE 2 - Eine funktionierende Lösung (OS X)

Ich denke, Apple hat es repariert.

Jetzt ist es einfacher als je zuvor, rufen Sie einfach an: 

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

EDIT: (Danke Jeremiah/Rollo)

Bei Swift für iOS ist dies der beste Weg, dies zu tun:

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

^^ Diese Funktionen machen Spaß!

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

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

//// END EDIT

Mach einfach das:

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

Oder wenn Sie nach einer bestimmten Klasse suchen

for view:CustomViewClass! in self.view.subviews {
        if view.isKindOfClass(CustomViewClass) {
            view.doClassThing()
        }
    }
272
Bseaborn

Für iOS/Swift, um alle von mir verwendeten Unteransichten zu entfernen:

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

um alle Unteransichten einer bestimmten Klasse (wie UILabel) zu entfernen, verwende ich:

for v in view.subviews{
   if v is UILabel{
      v.removeFromSuperview()
   }
}
31
tonethar

Der Code kann einfacher wie folgt geschrieben werden.

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

Dies sollte die einfachste Lösung sein.

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

(siehe Alle Unteransichten entfernen? für andere Methoden)


Beachten Sie, dass dies eine MacOS - Frage ist und diese Antwort nur für MacOS funktioniert. Es funktioniert nicht unter iOS.

14
Sulthan

Ich weiß nicht, ob Sie das Problem gelöst haben, aber ich habe kürzlich ein ähnliches Problem erlebt, bei dem die For-Schleife jedes Mal eine Ansicht hinterließ. Ich fand dies, weil das self.subviews (vielleicht) mutiert wurde, als die removeFromSuperview () aufgerufen wurde.

Um dies zu beheben, habe ich:

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

Durch Ausführen von .copy () konnte ich das Entfernen jeder Unteransicht durchführen, während das selfSubviews-Array mutiert wurde. Dies liegt daran, dass das kopierte Array (SubViews) alle Verweise auf die Objekte enthält und nicht mutiert ist.

EDIT: In Ihrem Fall denke ich, würden Sie verwenden:

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

Versuche dies:

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

Erweiterung zum Entfernen aller Unteransichten, wird schnell entfernt.

import Foundation
import UIKit

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

}
7
YannickSteph

Versuche dies: 

var subViews = parentView.subviews as Array<UIView>

      for someView in subViews
      {
          someView.removeFromSuperview()
      }

UPDATE: Wenn Sie sich abenteuerlich fühlen, können Sie eine Erweiterung in der UIView vornehmen, wie unten gezeigt: 

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

}

Und nenne es so: 

parentView.removeAllSubViews()
6
azamsharp

In xcodebeta6 hat das geklappt.

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

Ich habe diese Erweiterung geschrieben:

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

Damit Sie self.view.lf_removeAllSubviews in einem UIViewController verwenden können. Ich werde dies in die Swift-Version meines https://github.com/superarts/LFramework aufnehmen, wenn ich mehr Erfahrung in Swift habe (1 Tag bis jetzt und ja, für API habe ich aufgegeben unterstreichen).

3
superarts.org

du musst es versuchen

func clearAllScrollSubView ()
{
    let theSubviews = itemsScrollView.subviews

    for (var view) in theSubviews
    {

        if view is UIView
        {
            view.removeFromSuperview()
        }

    }
}
2
Ahmed Zaytoun

Swift 3

Wenn Sie Ihrer Ansicht ein Tag hinzufügen, können Sie eine bestimmte Ansicht entfernen.

for v in (view?.subviews)!
{
    if v.tag == 321
    {
         v.removeFromSuperview()
    }
 }
2
uplearnedu.com

Ihre Syntax ist etwas deaktiviert. Stellen Sie sicher, dass Sie explizit wirken.

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

Einzeiler:

while(view.subviews.count > 0) {(view.subviews[0] as NSView).removeFromSuperview()}

Ich denke, dass dieser Ansatz besser lesbar ist als die "Einzeiler", die map oder forEach verwenden. Kurze Hand foreach und map kann schwer zu verstehen sein, da die Logik abstrakter ist. 

1
eonist

Um nur Subviews einer bestimmten Klasse zu entfernen, war dies der einzige Swift-Code, der in Xcode6.1.1 ..__ für mich funktioniert hat. Angenommen, die einzigen Subviews, die Sie entfernen möchten, sind vom Typ UIButton ...

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

Für Swift 3

Ich habe folgendes getan, weil durch das Entfernen aus dem Überblick die Schaltflächen nicht aus dem Array gelöscht wurden.

    for k in 0..<buttons.count {

      buttons[k].removeFromSuperview()

    }


    buttons.removeAll()
1
Hope

Probieren Sie es aus, ich habe es getestet:

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

Für Swift 4.+

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

}

ich hoffe, das ist voll für Sie.

0
Masoud Heydari

Swift 5.0

Ich erstelle 2 verschiedene Methoden, um die Unteransicht zu entfernen. Und es ist viel einfacher zu benutzen, wenn wir sie in extension einfügen.

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