Saltar al contenido

Eliminar vistas en UIstackview swift

Solución:

En Swift 5.1

El método removeArrangedSubview elimina la vista proporcionada de la matriz arregladaSubvistas de la pila. La posición y el tamaño de la vista ya no serán administrados por la vista de pila. Sin embargo, este método no elimina la vista proporcionada de la matriz de subvistas de la pila; por lo tanto, la vista todavía se muestra como parte de la jerarquía de vistas.

Para evitar que la vista aparezca en la pantalla después de llamar al método removeArrangedSubview: de la pila, elimine explícitamente la vista de la matriz de subvistas llamando al método removeFromSuperview () de la vista, o establezca la propiedad isHidden de la vista en verdadero.

Entonces:

myStackView.removeArrangedSubview(myView)
myView.removeFromSuperview()

Extendido
Si tiene una serie de subvistas ordenadas y desea limpiarlas, también puede crear una extensión:

extension UIStackView {

    func removeFully(view: UIView) {
        removeArrangedSubview(view)
        view.removeFromSuperview()
    }

    func removeFullyAllArrangedSubviews() {
        arrangedSubviews.forEach { (view) in
            removeFully(view: view)
        }
    }

}

Si desea ocultar una vista dentro de una vista de pila, todo lo que tiene que hacer es establecer la propiedad oculta de la vista contenida en verdadero y la vista de pila se encarga del resto.

Entonces, lo que debe llamar por lo que entendí de su código es lo siguiente:

subview.hidden = true

Según mi experiencia, respaldada por probar la implementación (), todo lo que tiene que hacer para eliminar la subvista de stackView es llamar al método removeFromSuperview () en cada subvista de stackView:

stackView.subviews.forEach { (view) in
    view.removeFromSuperview()
}

Así es como se ve en la consola:

(lldb) po stackView.arrangedSubviews
▿ 3 elements
  - 0 : <UIStackView: 0x7f840c8297d0; frame = (0 0; 375 95); layer = <CATransformLayer: 0x600003f48c80>>
  - 1 : <UIStackView: 0x7f840c82f5e0; frame = (0 125; 375 95); layer = <CATransformLayer: 0x600003f54520>>
  ▿ 2 : <UIView: 0x7f840b3c93a0; frame = (0 250; 375 47); opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x600006bdae20>; layer = <CALayer: 0x600003f4a7e0>>

(lldb) po stackView.subviews
▿ 3 elements
  - 0 : <UIStackView: 0x7f840c8297d0; frame = (0 0; 375 95); layer = <CATransformLayer: 0x600003f48c80>>
  - 1 : <UIStackView: 0x7f840c82f5e0; frame = (0 125; 375 95); layer = <CATransformLayer: 0x600003f54520>>
  ▿ 2 : <UIView: 0x7f840b3c93a0; frame = (0 250; 375 47); opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x600006bdae20>; layer = <CALayer: 0x600003f4a7e0>>

Luego eliminas todas las subvistas:

(lldb) expression stackView.subviews.forEach { (view) in view.removeFromSuperview() }

Y el resultado:

(lldb) po stackView.subviews
0 elements

(lldb) po stackView.arrangedSubviews
0 elements

Puede hacer una extensión a UIStackView para ahorrarle algo de escritura en el futuro:

extension UIStackView {
    func removeAllSubviews() {
        subviews.forEach { (view) in
            view.removeFromSuperview()
        }
    }
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *