Ako spustiť dieťa funkciu z materskej?

0

Otázka

Chcem pozvať, aby childFunction() demo ChildView stlačením tlačidla v materskej zobraziť.

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

Aktualizácia: Vďaka @RajaKishan, funguje to, ale musím sa pracovať aj rekurzívne

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

Asi nie je najlepšie vyzerajúcich príklad, ale otázka je, ako účinnosti tlačidlo spustiť funkciu je to dieťa po používateľa navštívili príslušné dieťa.

Ako na začiatku, keď používateľ stlačí tlačidlo vytlačí "Toto zobrazenie je Rodič". Po užívateľ prichádza do child1 tlačidlo stlačte by print "Toto zobrazenie je Child1" tak, ako je to na. Tak, funkcie, ktorá tlačidlo beží, by mali byť uvedené aj z posledného dieťaťa.

Aktualizácia: Na konci som napísal toto riešenie.

Aktualizácia: Dostal som spätnú väzbu, pýtať sa mi o objasnenie. Žiadny problém. Dúfam, že to bude niekto pomôcť.:)

Vysvetlenie: Nechcel som zahrnul celý kód, stačí použiť jednoduchý príklad. Ale potreboval som to v mojej implementácii strom-ako generované menu: pri každej položke v menu má alebo nemá svoje deti. Stlačením na materskej objekt užívateľ príde do podradené objekty. A tu som musel byť schopný vrátiť sa z dieťaťa objekt na materskej, ale tento hovor odmietnuť funkciu z nadradeného objektu. Ja som sa používa nasledujúci kód a uvedené na tejto funkcie na každý rodič objektu:

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

Najlepšiu odpoveď

1

Môžete vytvoriť objekt pre 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 : Na zozname, môžete použiť pole modelu a zavolať cieľovej funkcie pomocou indexu.

Tu je jednoduchá dieťa-rodič príklad.

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
}

Poznámka: musíte index za sebou volať dieťa funkciu.

2021-11-24 07:34:52

Ahoj. Vďaka za odpoveď. Funguje to. Ale v prípade rekurzívne Zobraziť struct keď ContentView má ContentView childs vytvorený prostredníctvom NavigationLinks, ako by to mohlo byť riešené ako typ Hodnoty, nemôže byť uložený majetok, ktorý rekurzívne obsahuje to ?
Degtiarev Aleksei

@DegtiarevAleksei môžete, prosím uveďte jeden príklad na vašu otázku?
Raja Kishan

Aktualizované otázka
Degtiarev Aleksei

@DegtiarevAleksei som pridal upraviť časť. To môže byť užitočné.
Raja Kishan

Ďakujem za odpoveď, ale potom, čo som zostavil tlačidlo vždy vráti "Toto zobrazenie je Child2"
Degtiarev Aleksei

@DegtiarevAleksei je To preto, lebo mám nastaviť index 1 (arrData[1]) v akcia tlačidla. prečítajte si moja poznámka.
Raja Kishan

To nemusí fungovať podľa očakávania, pretože názory na SwiftUI sú structs, čo znamená, že prešiel hodnotu, tak skopíruje zakaždým, keď sú obehu. Na konci, môžete skončiť s viacerými, odlišné ChildView prípady, takže môžete skončiť volanie dieťaťa funkcie na iný pohľad ako ten, očakávate.
Cristik

@Cristik áno, myslím, že to je správne vytvoriť viacero inštancií pre každé dieťa, zobrazenie hovoru. Pretože sa chová inak, pre každý výskyt.
Raja Kishan

V iných jazykoch

Táto stránka je v iných jazykoch

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