¿Cuál es la mejor manera de eliminar todas las subvistas de su self.view?


87

Estaba pensando que tal vez algo como esto podría funcionar:

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

Quiero eliminar todo tipo de subvista. UIImages, botones, campos de texto, etc.


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

¿Eso funciona? Pensé que bse eliminaría rápidamente de la subviewsmatriz, lo que provocaría una mutación dentro de un ciclo de enumeración rápido, que está prohibido.
— Mazyod

2
@Mazyod comprueba la propiedad de las subvistas: @property (nonatomic, readonly, copy) NSArray * subviews: se declara como copia, por lo que cuando eliminamos subvistas no modificamos esa matriz (porque es una copia).
— Max

1
@Max: Eso es incorrecto. El copyespecificador significa que hace una copia cuando se establece ; no se especifica nada sobre la obtención. Es muy probable que se devuelva una copia, pero eso no forma parte de la definición de propiedad.
— jscs

@ W'rkncacnter está de acuerdo, tiene razón en que copiar la palabra clave no tiene nada que ver con obtener valor (pero creo que está implícito).
— Max

Respuestas:


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

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


¿Qué tal, excepto esto, usando el mismo método? @Mazyod
— Hemang

¿Hay alguna diferencia (por rendimiento) entre makeObjectsPerformSelector y el bucle manual para eliminar la subvista?
— Ganpat

22
self.view.subviews.forEach({ $0.removeFromSuperview() })

Versión idéntica en Swift.


7

Rápido:

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

2

Puedes usar así

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

view es la vista de la que desea eliminar todo. simplemente está eliminando cada subvista haciendo forEach


¿Puedes ampliar tu respuesta?
— DᴀʀᴛʜVᴀᴅᴇʀ

¿No es esto mutar una colección mientras la recorre?
— mixtly87

0

Para Swift 4 +. Puedes hacer una extensión a UIView. Llámalo cuando sea necesario.

extension UIView {
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.