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.