Comment faire pour exécuter l'enfant de la fonction de parent?

0

La question

Je veux l'appeler childFunction() démonstration ChildView en appuyant sur le bouton dans la vue parent.

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

Mise à jour: Merci @RajaKishan, il fonctionne, mais j'ai besoin qu'il fonctionne également de manière récursive

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

Peut-être est n'est pas le meilleur exemple, mais la question est, comment faire pour forcer le bouton pour exécuter la fonction de l'enfant après que l'utilisateur a visité correspondant de l'enfant.

Comme, à commencer quand l'utilisateur appuie sur le bouton, il imprime "Ce point de vue est le Parent". Après que l'utilisateur vient à l'enfant1 appuyez sur le bouton devrait print "Ce point de vue est Enfant1" comme l'a si sur. Donc, la fonction de ce bouton exécute doit être référencé à partir du dernier enfant.

Mise à jour: En fin de compte, j'ai écrit cette solution.

Mise à jour: J'ai reçu des commentaires, à me demander des précisions. Pas de problème. J'espère que ça aidera quelqu'un.:)

Précisions: Je n'ai pas l'entourer de code, juste utilisé un exemple simple. Mais j'avais besoin de ça dans ma mise en œuvre d'un arbre généré menu: lors de chaque élément dans le menu a ou n'a pas ses enfants. En appuyant sur le parent de l'objet utilisateur vient dans les objets enfants. Et ici, j'ai besoin d'être en mesure de revenir d'un objet enfant à parent, mais l'appelle de rejeter la fonction de l'objet parent. Pour cela, j'ai utilisé le code suivant et renvoyé à cette fonction à chaque parent de l'objet:

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

La meilleure réponse

1

Vous pouvez créer un objet pour 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 : Pour la liste, vous pouvez utiliser le tableau du modèle et de l'appel de la destination en fonction de l'indice.

Voici le simple parent-enfant par exemple.

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
}

Remarque: Vous devez indice de la ligne d'appel de fonction d'enfant.

2021-11-24 07:34:52

Salut. Merci pour la réponse. Elle fonctionne. Mais dans le cas de récursive Vue struct quand ContentView a ContentView childs créé par NavigationLinks, comment cela pourrait-il être résolu que le type de Valeur ne peut pas avoir stocké, bien que de manière récursive contient-il ?
Degtiarev Aleksei

@DegtiarevAleksei pouvez-vous s'il vous plaît ajouter un exemple à votre question?
Raja Kishan

Mise à jour de la question
Degtiarev Aleksei

@DegtiarevAleksei j'ai ajouté la partie édition. Cela peut être utile.
Raja Kishan

Merci pour la réponse, mais après j'ai compilé le bouton renvoie toujours "Ce point de vue est Enfant2"
Degtiarev Aleksei

@DegtiarevAleksei C'est parce que j'ai mis à l'index 1 (arrData[1]) dans le bouton d'action. lire ma note.
Raja Kishan

Cela pourrait ne pas fonctionner comme prévu parce que les vues en SwiftUI sont les structures, ce qui signifie qu'ils sont passés par valeur, donc copié à chaque fois qu'ils sont diffusés. En fin de compte, vous vous retrouvez avec plusieurs, distinctes ChildView cas, de sorte que vous pourriez finir vers le haut de l'appel de la fonction d'enfant sur un autre point de vue que celui que vous attendez.
Cristik

@Cristik oui je pense que c'est le droit de créer plusieurs instances pour chaque enfant de l'affichage. Parce qu'il se comporte différemment pour chaque occurrence.
Raja Kishan

Dans d'autres langues

Cette page est dans d'autres langues

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