2012-08-09 2 views
78

Stavo pensando che forse qualcosa di simile potrebbe funzionare:Qual è il modo migliore per rimuovere tutte le sottoview da te stesso.view?

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

Voglio rimuovere ogni tipo di visualizzazione secondaria. UIImages, pulsanti, campi di testo, ecc.

+1

Che funzionerà. Potresti doverlo fare in modo ricorsivo se hai diversi livelli di sottoview ... o forse no. Non sono sicuro di cosa vuoi fare questo per. – Dustin

+0

Che funziona? Ho pensato che 'b' sarebbe stato prontamente rimosso dalla matrice' subviews', causando una mutazione all'interno di un ciclo di enumerazione veloce, che è proibito. – Mazyod

+2

@Mazyod controlla la proprietà delle sottoview: @property (nonatomic, readonly, copy) NSArray * subviews - è dichiarato come copia, quindi quando stiamo eliminando le sottoview non modifichiamo quella matrice (perché è una copia). – Max

risposta

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

È identico alla variante, ma leggermente più corto.

+0

E a parte questo - usando lo stesso metodo? @Mazyod – Hemang

+0

Esiste qualche differenza (in termini di prestazioni) tra makeObjectsPerformSelector e loop manuale per la rimozione di subview? – Ganesh

6

Swift:

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

versione identica a Swift.

1

È possibile utilizzare questa vista

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

è la vista che si desidera rimuovere tutto da. stai semplicemente rimuovendo ogni sottoview eseguendo forEach

+0

Puoi espandere la tua risposta? –

+0

Non sta mutando una collezione mentre la sta iterando? – mixtly87