¿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.

dgund
fuente
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.

Max
fuente
¿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.

lcl
fuente
7

Rápido:

extension UIView {
    func removeAllSubviews() {
        for subview in subviews {
            subview.removeFromSuperview()
        }
    }
}
mixel
fuente
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

spikee
fuente
¿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() }
    }
}
ishwardgret
fuente