Saltar al contenido

Cómo pasar una vista de SwiftUI como variable a otra estructura de vista

Luego de mirar en diversos repositorios y páginas webs finalmente hemos dado con la solución que te compartiremos más adelante.

Solución:

La forma en que Apple lo hace es usando constructores de funciones. Hay uno predefinido llamado ViewBuilder. Conviértalo en el último argumento, o el único argumento, de su init método para MenuItemal igual que:

..., @ViewBuilder builder: @escaping () -> Content)

Asígnalo a una propiedad definida algo como esto:

let viewBuilder: () -> Content

Luego, donde desee mostrar las vistas pasadas, simplemente llame a la función de esta manera:

HStack 
    viewBuilder()

Podrá usar su nueva vista de esta manera:

MenuItem 
   Image("myImage")
   Text("My Text")

Esto le permitirá pasar hasta 10 vistas y usar if condiciones, etc. aunque si desea que sea más restrictivo, tendrá que definir su propio generador de funciones. No lo he hecho, así que tendrás que buscarlo en Google.

Para resumir todo lo que leí aquí y la solución que funcionó para mí y en iOS14:

struct ContainerView: View 
    let content: Content

    init(@ViewBuilder content: @escaping () -> Content) 
        self.content = content()
    
    
    var body: some View 
        content
    

Esto no sólo le permite simplificar Views adentro, pero también, gracias a @ViewBuilderusar if-else y switch-case bloques:

struct SimpleView: View 
    var body: some View 
        ContainerView 
            Text("SimpleView Text")
        
    


struct IfElseView: View 
    var flag = true
    
    var body: some View 
        ContainerView 
            if flag 
                Text("True text")
             else 
                Text("False text")
            
        
    


struct SwitchCaseView: View 
    var condition = 1
    
    var body: some View 
        ContainerView 
            switch condition 
            case 1:
                Text("One")
            case 2:
                Text("Two")
            default:
                Text("Default")
            
        
    

Prima:
Si desea un contenedor codicioso, que reclame todo el espacio posible (a diferencia del contenedor anterior, que solo reclama el espacio necesario para sus subvistas), aquí está:

struct GreedyContainerView: View 
    let content: Content

    init(@ViewBuilder content: @escaping () -> Content) 
        self.content = content()
    
    
    var body: some View 
        Color.clear
            .overlay(content)
    

Debe hacer que el parámetro genérico sea parte de MenuItem:

struct MenuItem: View 
    private var destinationView: Content

    init(destinationView: Content) 
        self.destinationView = destinationView
    

    var body : some View 
        // ...
    

Comentarios y valoraciones del tutorial

Nos puedes defender nuestra tarea poniendo un comentario y dejando una valoración te estamos eternamente agradecidos.

¡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 *