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.

dgund
quelle
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.

Max
quelle
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.

lcl
quelle
7

Schnell:

extension UIView {
    func removeAllSubviews() {
        for subview in subviews {
            subview.removeFromSuperview()
        }
    }
}
mischen
quelle
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

Spikee
quelle
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() }
    }
}
ishwardgret
quelle