Jak spustit dítě funkce z mateřské?

0

Otázka

Chci zavolat childFunction() demo ChildView stisknutím tlačítka v rodičovském pohledu.

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

Aktualizace: Díky @RajaKishan, to funguje, ale potřebuju to funguje také rekurzivně

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

Možná je není nejhezčí příklad, ale otázka je, jak vynutit na tlačítko pro spuštění funkce je dítě po uživatel navštívil odpovídající dítěte.

Jako na začátku, když uživatel stiskne tlačítko tiskne "Tento pohled je Rodič". Poté, co uživatel přijde na child1 tlačítka tisk by měl vytisknout "Tento pohled je Child1" jak tak na. Takže, funkci, kterou tlačítko běží, by měla být odkazoval se z poslední dítě.

Aktualizace: Nakonec jsem napsal to řešení.

Aktualizace: Dostal jsem zpětnou vazbu, ptát se mě na vysvětlení. Žádný problém. Doufám, že to pomůže někdo.:)

Upřesnění: Nevěděl jsem, uzavřete celý kód, stačí použít jednoduchý příklad. Ale potřeboval jsem to v mé implementaci strom-jako generované menu: když každá položka v menu má, nebo nemá své děti. Stisknutím tlačítka na mateřské objekt uživatel přijde do podřízené objekty. A tady musím být schopen se vrátit dítě objekt na mateřskou, ale říkat to zamítl funkce z nadřazeného objektu. Na to jsem použil následující kód a podle této funkce, aby každý rodič objektu:

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

Nejlepší odpověď

1

Můžete vytvořit objekt pro 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 : Pro seznam, můžete použít pole modelu a zavolat na cílovou funkci index.

Zde je jednoduchý dítě-rodič příkladem.

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 indexu pro řádek, který chcete volat dítě funkce.

2021-11-24 07:34:52

Ahoj. Díky za odpověď. To funguje. Ale v případě rekurzivní Zobrazení struct když ContentView má ContentView childs vytvořený přes NavigationLinks, jak by to mohlo být řešeno jako Hodnota typu nemůže mít uložený majetek, který rekurzivně obsahuje ?
Degtiarev Aleksei

@DegtiarevAleksei můžete, prosím, přidat jeden příklad, na vaši otázku?
Raja Kishan

Aktualizováno na otázku
Degtiarev Aleksei

@DegtiarevAleksei přidal jsem upravit díl. To by mohlo být užitečné.
Raja Kishan

Děkuji za odpověď, ale poté, co jsem sestavil tlačítko vždy vrátí "Tento pohled je Child2"
Degtiarev Aleksei

@DegtiarevAleksei je To proto, že mám nastavit index 1 (arrData[1]) v tlačítko akce. přečtěte si můj vzkaz.
Raja Kishan

To nemusí fungovat, jak se očekávalo, protože názory v SwiftUI jsou structs, což znamená, že jsou předány hodnotou, tak zkopírovat pokaždé, když jsou v oběhu. Na konci, budete skončit s více, zřetelný ChildView případech, takže byste mohli skončit volání funkce dítěte na jiný pohled, než očekáváte.
Cristik

@Cristik ano, myslím, že je to správné chcete-li vytvořit více instancí pro každé dítě zobrazení hovoru. Protože se to chová různě pro každý výskyt.
Raja Kishan

V jiných jazycích

Tato stránka je v jiných jazycích

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