Come eseguire la funzione figlio dal padre?

0

Domanda

Voglio chiamare childFunction() demo ChildView premendo il pulsante di visualizzazione principale.

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

Aggiornamento: Grazie @RajaKishan, funziona, ma ho bisogno di lavorare anche in modo ricorsivo

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

Forse non è il miglior esempio, ma la domanda è, come forzare il pulsante per eseguire la funzione di bambino dopo che l'utente ha visitato corrispondente bambino.

Come, inizia quando l'utente preme il pulsante di stampa ("Questo punto di vista è Padre". Dopo che l'utente viene a child1 la pressione del pulsante di stampa "Questo punto di vista è Child1" come così via. Quindi, la funzione del pulsante viene eseguita deve essere indicato da ultimo figlio.

Aggiornamento: Alla fine ho scritto questa soluzione.

Aggiornamento: Ho ricevuto feedback, mi chiede un chiarimento. Nessun problema. Spero che sarà di aiuto a qualcuno.:)

Chiarimento: Io non racchiudere il codice, basta usare un semplice esempio. Ma avevo bisogno di questo nella mia implementazione di un albero-come menu generato: quando ogni voce del menu è o non avere figli. Premendo sull'oggetto principale utente entra in oggetti figlio. E qui ho bisogno di essere in grado di tornare da un oggetto figlio per un genitore, ma la chiamata a questa funzione elimina dall'oggetto padre. Per questo ho utilizzato il seguente codice e di cui all'questa funzione per ciascun genitore oggetto:

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

Migliore risposta

1

È possibile creare un oggetto per 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 : Per l'elenco, è possibile utilizzare la matrice del modello e chiamare la destinazione in funzione di un indice.

Ecco il semplice bambino-genitore esempio.

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: È necessario per l'indice di riga per chiamare la funzione figlio.

2021-11-24 07:34:52

Ciao. Grazie per la risposta. Funziona. Ma nel caso ricorsivo di Vista struct quando ContentView ha ContentView childs creato tramite NavigationLinks, come questo potrebbe essere risolto come tipo di Valore può avere una stored proprietà in modo ricorsivo la contiene ?
Degtiarev Aleksei

@DegtiarevAleksei potete aggiungere un esempio di domanda?
Raja Kishan

Aggiornata la questione
Degtiarev Aleksei

@DegtiarevAleksei ho aggiunto la parte di modifica. Questo potrebbe essere utile.
Raja Kishan

Grazie per la risposta, ma dopo che ho compilato il pulsante restituisce sempre "Questo punto di vista è Child2"
Degtiarev Aleksei

@DegtiarevAleksei è perché ho impostato indice 1 (arrData[1]) il pulsante di azione. leggi la mia nota.
Raja Kishan

Questo potrebbe non funzionare come previsto in quanto vista in SwiftUI sono le strutture, il che significa che sono passati per valore, quindi copiato ogni volta che vengono diffusi. Alla fine, si finisce con più distinti ChildView le istanze, così si potrebbe finire per chiamare il figlio funzione su un altro punto di vista rispetto a quello che si aspettano.
Cristik

@Cristik sì, io penso che questo è giusto per creare più istanze per ogni bambino vista di chiamata. Perché si comporta in modo diverso per ogni occorrenza.
Raja Kishan

In altre lingue

Questa pagina è in altre lingue

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