2012-08-09 9 views
78

Myślałam może coś takiego może działać:Jaki jest najlepszy sposób na usunięcie wszystkich subviews z ciebie self.view?

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

Chcę usunąć każdy rodzaj podrzędny. UIImages, Buttons, Textfields itp.

+1

To zadziała. Być może będziesz musiał zrobić to w sposób rekursywny, jeśli masz kilka poziomów subviews ... a może nie. Nie jestem pewien, za co chcesz to zrobić. – Dustin

+0

To działa? Myślałem, że 'b' zostanie natychmiast usunięty z tablicy' subviews', powodując mutację w obrębie szybkiej pętli wyliczeniowej, co jest zabronione. – Mazyod

+2

@Mazyod sprawdź właściwość subviews: @property (nonatomic, readonly, copy) NSArray * subviews - jest zadeklarowany jako copy, więc gdy usuwamy subviews, nie modyfikujemy tej tablicy (ponieważ jest to kopia). – Max

Odpowiedz

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

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

+0

Co z tym wyjątkiem - używając tej samej metody? @Mazyod – Hemang

+0

Czy jest jakaś różnica (między wydajnością) między makeObjectsPerformSelector i ręcznie pętli do usuwania subview? – Ganesh

6

Swift:

extension UIView { 
    func removeAllSubviews() { 
     for subview in subviews { 
      subview.removeFromSuperview() 
     } 
    } 
} 
13
self.view.subviews.forEach({ $0.removeFromSuperview() }) 

Identyczna wersja Swifta.

1

można używać jak to

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

widzenia jest pogląd, że chcesz usunąć wszystko od. po prostu usuwasz każdy wyrób, wykonując forEach

+0

Czy możesz rozwinąć swoją odpowiedź? –

+0

Czy to nie powoduje mutacji kolekcji podczas jej iterowania? – mixtly87

Powiązane problemy