Jaki jest najlepszy sposób na usunięcie wszystkich podglądów z Ciebie self.view?

87

Myślałem, że może coś takiego może zadziałać:

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

Chcę usunąć każdy rodzaj podglądu. UIImages, przyciski, pola tekstowe itp.

dgund
źródło
1
To zadziała. Być może będziesz musiał to zrobić rekurencyjnie, jeśli masz kilka poziomów podglądów podrzędnych ... a może nie. Nie jestem pewien, po co chcesz to zrobić.
Dustin,
To działa? Pomyślałem, że bzostanie to natychmiast usunięte z subviewstablicy, powodując mutację w szybkiej pętli wyliczania, co jest zabronione.
Mazyod
2
@Mazyod check subviews property: @property (nonatomic, readonly, copy) NSArray * subviews - jest zadeklarowane jako kopia, więc kiedy usuwamy podwidoki, nie modyfikujemy tej tablicy (bo jest to kopia).
Maksymalnie
1
@Max: To nieprawidłowe. Specyfikator copyoznacza, że po ustawieniu tworzy kopię ; nic nie jest określone na temat pobierania. Jest całkiem prawdopodobne, że kopia zostanie zwrócona, ale nie jest to część definicji właściwości.
jscs
@ W'rkncacnter zgadzam się, masz rację, że słowo kluczowe copy nie ma nic wspólnego z uzyskiwaniem wartości (ale myślę, że jest to dorozumiane).
Maksymalnie

Odpowiedzi:

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

Jest identyczny z twoim wariantem, ale nieco krótszy.

Maks
źródło
A poza tym - używając tej samej metody? @Mazyod
Hemang
Czy jest jakaś różnica (pod względem wydajności) między makeObjectsPerformSelector a ręczną pętlą do usuwania widoku podrzędnego?
Ganpat,
22
self.view.subviews.forEach({ $0.removeFromSuperview() })

Identyczna wersja w Swift.

lcl
źródło
7

Szybki:

extension UIView {
    func removeAllSubviews() {
        for subview in subviews {
            subview.removeFromSuperview()
        }
    }
}
mixel
źródło
2

Możesz używać w ten sposób

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

widok to widok, z którego chcesz usunąć wszystko. po prostu usuwasz wszystkie podziały, wykonując forEach

spikee
źródło
Czy możesz rozwinąć swoją odpowiedź?
DᴀʀᴛʜVᴀᴅᴇʀ
Czy to nie jest mutowanie kolekcji podczas iterowania przez nią?
mixtly87
0

Dla Swift 4 +. Możesz rozszerzyć UIView. Zadzwoń, kiedy to konieczne.

extension UIView {
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }
}
ishwardgret
źródło