Cómo ejecutar el funcionamiento del niño de los padres?

0

Pregunta

Quiero llamar childFunction() demostración ChildView pulsando el botón en la vista principal.

import SwiftUI

struct ChildView: View {
    
    func childFunction() {
        print("I am the child")
    }

    var body: some View {
      Text("I am the child")
    }
}

struct ContentView: View {
    var function: (() -> Void)?

    var body: some View {
        ChildView()
        
        Button(action: {
            self.function!()
        }, label: {
            Text("Button")
        })
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Actualización: Gracias @RajaKishan, funciona, pero la necesito para trabajar, también de forma recursiva

import SwiftUI

struct ContentView: View {
    @State var text: String = "Parent"
    var isNavigationViewAvailable = true
    
    func function() {
        print("This view is \(text)")
    }
    
    var body: some View {
        
        VStack {
            if isNavigationViewAvailable  {
                Button(action: {
                    function()
                }, label: {
                    Text("Button")
                })
            }
           
            
            if isNavigationViewAvailable {
                NavigationView {
                    List {
                        NavigationLink("Child1") {
                            ContentView(text: "Child1", isNavigationViewAvailable: false)
                        }
                        NavigationLink("Child2") {
                            ContentView(text: "Child2", isNavigationViewAvailable: false)
                        }
                        NavigationLink("Child3") {
                            ContentView(text: "Child3", isNavigationViewAvailable: false)
                        }
                    }
                }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Tal vez no es el mejor ejemplo, pero la pregunta es, cómo forzar el botón para ejecutar la función de su niño después de que el usuario visitó correspondiente niño.

Como, en inicio cuando el usuario presiona el botón se imprime "Este punto de vista es de los Padres". Después de que el usuario viene a child1 al pulsar el botón imprimir "Este punto de vista es Child1" como así sucesivamente. Así, la función que el botón se ejecuta debe ser referenciados desde el último niño.

Actualización: Al final me escribió esta solución.

Actualización: He recibido comentarios, me pide una aclaración. No hay problema. Espero que ayude a alguien.:)

Aclaración: Yo no encierre el código en su totalidad, sólo un ejemplo sencillo. Pero yo necesitaba esto en mi aplicación de un árbol de menú generado: cuando cada elemento en el menú tiene o no tiene hijos. Pulsando sobre el objeto primario de usuario llega a los objetos secundarios. Y aquí me necesita para ser capaz de volver de un objeto hijo a padre, pero llamar a esto despedir a la función del objeto principal. Para esto he utilizado el siguiente código y se refirió a esta función para cada uno de los padres de objeto:

@Environment(\.presentationMode) var presentationMode
 presentationMode.wrappedValue.dismiss()
ios swift swiftui
2021-11-24 05:44:05
1

Mejor respuesta

1

Usted puede crear un objeto para un ChildView.

struct ChildView: View {
 
    func childFunction() {
        print("I am the child")
    }
    
    var body: some View {
        Text("I am the child")
    }
}

struct ContentView: View {
    
    let childView = ChildView()
    
    var body: some View {
        childView
        Button(action: {
            childView.childFunction()
        }, label: {
            Text("Button")
        })
    }
}


EDIT : Para la lista, se puede utilizar la matriz de la modelo y llamar a la función destino por el índice.

Aquí está el simple niño-padres de ejemplo.

struct ChildView: View {
    var text: String
    
    func childFunction() {
        print("This view is \(text)")
    }
    
    var body: some View {
        Text("I am the child")
    }
}



struct ContentView55: View {
    
    @State private var arrData = [Model(title: "Child1", destination: ChildView(text: "Child1")),
                                           Model(title: "Child2", destination: ChildView(text: "Child2")),
                                           Model(title: "Child3", destination: ChildView(text: "Child3"))]
    
    var body: some View {
        
        VStack {
            Button(action: {
                arrData[1].destination.childFunction()
            }, label: {
                Text("Button")
            })
            
            NavigationView {
                SwiftUI.List(arrData) {
                    NavigationLink($0.title, destination: $0.destination)
                }
            }
        }
    }
    
}
struct Model: Identifiable {
    var id = UUID()
    var title: String
    var destination: ChildView
}

Nota: Usted necesita índice de la fila para llamar hijo de la función.

2021-11-24 07:34:52

Hola. Gracias por la respuesta. Funciona. Pero en el caso de recursivas Ver struct cuando ContentView ha ContentView childs creado a través de NavigationLinks, ¿cómo se podría resolver este problema como tipo de Valor puede tener una almacenados los bienes que de forma recursiva la contiene ?
Degtiarev Aleksei

@DegtiarevAleksei por favor, puedes agregar un ejemplo a tu pregunta?
Raja Kishan

Actualizada la pregunta
Degtiarev Aleksei

@DegtiarevAleksei he añadido la parte de edición. Esto puede ser de ayuda.
Raja Kishan

Gracias por la respuesta, pero después he compilado el botón siempre devuelve "Este punto de vista es Child2"
Degtiarev Aleksei

@DegtiarevAleksei es porque he puesto en el índice 1 (arrData[1]) en el botón de acción. leer mi nota.
Raja Kishan

Esto podría no funcionar como se esperaba debido a las vistas en SwiftUI son estructuras, lo que significa que se pasan por valor, por lo tanto copiado cada vez que se circula. Al final, acabará con varios, distintos ChildView de los casos, lo que podría terminar recalando en el funcionamiento del niño en otro punto de vista distinto del que esperaba.
Cristik

@Cristik sí creo que este es el adecuado para crear varias instancias para cada niño de la vista de llamada. Porque se comporta de manera diferente para cada ocurrencia.
Raja Kishan

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................