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.


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.


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.


7

Szybki:

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

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


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() }
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.