2012-08-09 11 views
78

Estaba pensando que quizás algo como esto podría funcionar:¿Cuál es la mejor manera de eliminar todas las subvistas de usted self.view?

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

Quiero eliminar toda clase de vista secundaria. UIImages, botones, campos de texto, etc.

+1

Eso funcionará. Es posible que tenga que hacerlo de forma recursiva si tiene varios niveles de subvistas ... o tal vez no. No estoy seguro de para qué quieres hacer esto. – Dustin

+0

Eso funciona? Pensé que 'b' se eliminaría rápidamente de la matriz' subviews', causando una mutación dentro de un bucle de enumeración rápida, que está prohibido. – Mazyod

+2

@Mazyod check subviews property: @property (nonatomic, readonly, copy) Subvistas de NSArray * - se declara como copia, por lo que cuando eliminamos subvistas no modificamos esa matriz (porque es una copia). – Max

Respuesta

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

Es idéntico a su variante, pero un poco más corto.

+0

¿Qué pasa con excepción de esto - usando el mismo método? @Mazyod – Hemang

+0

¿Hay alguna diferencia (por rendimiento) entre makeObjectsPerformSelector y un ciclo manual para eliminar subvista? – Ganesh

6

Swift:

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

versión idéntica en Swift.

1

Se puede utilizar como este punto de 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() 
} 

es la vista que desea quitar todo, desde. solo está eliminando cada subvista haciendo porEach

+0

¿Puedes ampliar tu respuesta? –

+0

¿No es esta mutación una colección mientras se repite a través de ella? – mixtly87

Cuestiones relacionadas