Was ist der beste Weg, um alle Unteransichten aus Ihrer Selbstansicht zu entfernen?


87

Ich dachte, vielleicht könnte so etwas funktionieren:

    for (UIView* b in self.view.subviews)
    {
       [b removeFromSuperview];
    }

Ich möchte jede Art von Unteransicht entfernen. UIImages, Buttons, Textfelder etc.


1
Das wird funktionieren. Möglicherweise müssen Sie dies rekursiv tun, wenn Sie mehrere Ebenen von Unteransichten haben ... oder auch nicht. Ich bin mir nicht sicher, wofür du das machen willst.
Dustin

Das funktioniert? Ich dachte, das bwürde sofort aus dem subviewsArray entfernt, was zu einer Mutation innerhalb einer schnellen Aufzählungsschleife führen würde, was verboten ist.
Mazyod

2
@ Mazyod check subviews-Eigenschaft: @property (nichtatomar, schreibgeschützt, kopieren) NSArray * -Unteransichten - Es wird als Kopie deklariert. Wenn wir also Unteransichten löschen, ändern wir dieses Array nicht (weil es eine Kopie ist).
Max

1
@ Max: Das ist falsch. Die copySpezifikations bedeutet , dass es eine Kopie macht , wenn festgelegt ; Über das Erhalten ist nichts angegeben. Es ist sehr wahrscheinlich, dass eine Kopie zurückgegeben wird, aber das ist nicht Teil der Eigenschaftsdefinition.
Jscs

@ W'rkncacnter stimme zu, du hast Recht, dass das Schlüsselwort copy nichts mit get value zu tun hat (aber ich denke, es ist impliziert).
Max

Antworten:


249
[self.view.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)];

Es ist identisch mit Ihrer Variante, aber etwas kürzer.


Was ist mit dieser Ausnahme - mit der gleichen Methode? @ Mazyod
Hemang

Gibt es einen Unterschied (nach Leistung) zwischen makeObjectsPerformSelector und der manuellen Schleife zum Entfernen der Unteransicht?
Ganpat

21
self.view.subviews.forEach({ $0.removeFromSuperview() })

Identische Version in Swift.


7

Schnell:

extension UIView {
    func removeAllSubviews() {
        for subview in subviews {
            subview.removeFromSuperview()
        }
    }
}

1

Sie können so verwenden

//adding an object to the view
view.addSubView(UIButton())

// you can remove any UIControls you have added with this code
view.subviews.forEach { (item) in
     item.removeFromSuperview()
}

Ansicht ist die Ansicht, aus der Sie alles entfernen möchten. Sie entfernen einfach jede Unteransicht, indem Sie forEach ausführen


Können Sie Ihre Antwort erweitern?
DᴀʀᴛʜVᴀᴅᴇʀ

Mutiert dies nicht eine Sammlung, während sie durchlaufen wird?
mixtly87

0

Für Swift 4 + können Sie eine Erweiterung vornehmen UIView. Rufen Sie es an, wann immer es nötig ist.

extension UIView {
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.