Ich suche nach einer einfachen Methode, um alle Unteransichten auf einmal aus einer Übersicht zu entfernen, anstatt sie einzeln 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?
AKTUALISIEREN
Meine App hat eine Haupt container_view
. Ich muss verschiedene andere Ansichten als Unteransichten hinzufügen container_view
, um eine Art Navigation bereitzustellen.
Wenn ich also auf die Schaltfläche klicke, 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 behoben.
Jetzt ist es einfacher als je zuvor. Rufen Sie einfach an:
for view in containerView.subviews{
view.removeFromSuperview()
}
Antworten:
EDIT: (danke Jeremiah / Rollo)
Bei weitem der beste Weg, dies in Swift für iOS zu tun, ist:
^^ Diese Funktionen machen Spaß!
//// END EDIT
Mach das einfach:
Oder wenn Sie nach einer bestimmten Klasse suchen
quelle
result of call to 'map' is unused
ist kein Fehler.Array.map
In den meisten Sprachen wird das geänderte Array zurückgegeben. Die äquivalente Methode, die kein Array zurückgibt, wäreview.subviews.forEach
.for view:CustomViewClass! in self.view.subviews where view.isKindOfClass(CustomViewClass) { view.doClassThing() }
Für iOS / Swift, um alle von mir verwendeten Unteransichten zu entfernen:
Um alle Unteransichten einer bestimmten Klasse (wie UILabel) zu entfernen, verwende ich:
quelle
Der Code kann wie folgt einfacher geschrieben werden.
quelle
Dies sollte die einfachste Lösung sein.
( Weitere Methoden finden Sie unter Entfernen aller Unteransichten .)
Beachten Sie, dass dies eine MacOS- Frage ist und diese Antwort nur für MacOS funktioniert . Es funktioniert nicht unter iOS.
quelle
NSView
(OS X) undUIView
(iOS).NSView
, nicht für iOS undUIView
. Nur die Leute möchten die Frage und die Tags nicht lesen, daher wurden sie mit iOS-Antworten gefüllt.Ich weiß nicht, ob Sie es geschafft haben, dieses Problem zu beheben, aber ich habe kürzlich ein ähnliches Problem festgestellt, bei dem die For-Schleife jedes Mal eine Ansicht verlassen hat. Ich fand dies, weil die self.subviews (vielleicht) mutiert waren, als removeFromSuperview () aufgerufen wurde.
Um dies zu beheben, habe ich:
Mit .copy () konnte ich jede Unteransicht entfernen, während das Array self.subviews 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, dass Sie verwenden würden:
quelle
let subViewsArray: Array = (parentView.subviews as NSArray).copy() as Array<NSView>
Versuche dies:
quelle
Erweiterung zum Entfernen aller Unteransichten wird schnell entfernt.
quelle
Versuche dies:
UPDATE : Wenn Sie sich abenteuerlustig fühlen, können Sie die UIView wie folgt erweitern:
Und nenne es so:
quelle
In xcodebeta6 hat das geklappt.
quelle
Ich habe diese Erweiterung geschrieben:
Damit Sie self.view.lf_removeAllSubviews in einem UIViewController verwenden können. Ich werde dies später in die schnelle Version meines https://github.com/superarts/LFrameworks aufnehmen , wenn ich mehr Erfahrung mit Swift habe (1 Tag Erfahrung bisher, und ja, für API habe ich den Unterstrich aufgegeben).
quelle
Swift 3
Wenn Sie Ihrer Ansicht ein Tag hinzufügen, können Sie eine bestimmte Ansicht entfernen.
quelle
view.subviews.filter({$0.tag != 321}).forEach({$0.removeFromSuperview()})
?Swift 5
Ich erstelle 2 verschiedene Methoden, um die Unteransicht zu entfernen. Und es ist viel einfacher zu bedienen, wenn wir sie einsetzen
extension
quelle
Ihre Syntax ist leicht falsch. Stellen Sie sicher, dass Sie explizit besetzen.
quelle
du musst das versuchen
quelle
Zum Entfernen nur von Unteransichten einer bestimmten Klasse - dies war der einzige Swift-Code, der in Xcode6.1.1 für mich funktioniert hat. Angenommen, die einzigen Unteransichten, die Sie entfernen möchten, sind vom Typ UIButton ...
quelle
Einzeiler:
Ich denke, dieser Ansatz ist besser lesbar als die "Einzeiler" mit map oder forEach . Kurzes Foreach und Map können schwierig zu verstehen sein, da die Logik abstrakter ist.
quelle
Für Swift 3
Ich habe Folgendes getan, weil durch einfaches Entfernen aus der Übersicht die Schaltflächen nicht aus dem Array gelöscht wurden.
quelle
Probieren Sie es aus, ich habe dies getestet:
quelle
Zum
Swift 4.+
Ich hoffe, dass dies für Sie voll genutzt wird.
quelle
Hast du so etwas versucht?
quelle