Cum de a rula copil funcția de părinte?

0

Problema

Vreau să sun childFunction() demo ChildView prin apăsarea butonului în vedere părinte.

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

Update: Multumesc @RajaKishan, functioneaza, dar am nevoie de lucru, de asemenea, recursiv

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

Poate că nu este cel mai bun în căutarea de exemplu, dar întrebarea este, cum de a forța butonul pentru a rula funcția de copil după ce utilizatorul a vizitat corespunzătoare a copilului.

Astfel, la pornire, atunci când utilizatorul apasă butonul tipărește "Acest punct de vedere este Mamă". După ce utilizatorul vine la copilului1 butonul de presa print "Acest punct de vedere este Copilului1", ca așa mai departe. Deci, funcția care butonul rulează ar trebui să fie de referință de la ultimul copil.

Update: În final, am scris această soluție.

Update: Am primit feedback-ul pentru a-mi cere clarificări. Nici o problema. Sper că va ajuta pe cineva.:)

Clarificare: Nu am anexeze întregul cod, folosit doar un simplu exemplu. Dar am nevoie de aceasta în punerea în aplicare a unui copac, cum ar fi generat meniu: atunci când fiecare element din meniu are sau nu are copii. Apăsați pe obiect părinte utilizatorul vine în obiectele copil. Și aici am nevoie pentru a fi capabil de a veni înapoi de la un copil la obiect părinte, dar suna acest respingerea funcție de obiectul parinte. Pentru aceasta am utilizat următorul cod și menționate la această funcție pentru fiecare părinte obiect:

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

Cel mai bun răspuns

1

Puteți crea un obiect pentru o 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 : Pentru lista, puteți utiliza matrice de model și de apel destinație funcție de index.

Aici este simplu copil-părinte exemplu.

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
}

Notă: trebuie să indice pentru rând pentru a apela copilul funcție.

2021-11-24 07:34:52

Salut. Multumesc pentru raspuns. Acesta funcționează. Dar în cazul recursiv Vedere struct când ContentView a ContentView childs creat prin NavigationLinks, cum acest lucru ar putea fi rezolvate ca tip de Valoare nu poate fi stocată o proprietate care recursiv conține acesta ?
Degtiarev Aleksei

@DegtiarevAleksei puteți să vă rugăm să adăugați un exemplu la intrebarea ta?
Raja Kishan

Actualizat la întrebare
Degtiarev Aleksei

@DegtiarevAleksei am adăugat edita parte. Acest lucru ar putea fi de ajutor.
Raja Kishan

Mulțumesc pentru răspuns, dar după ce am compilat butonul întotdeauna se întoarce "Acest punct de vedere este Child2"
Degtiarev Aleksei

@DegtiarevAleksei este pentru Că am stabilit indicele 1 (arrData[1]) în butonul de acțiune. citit mesajul meu.
Raja Kishan

Acest lucru ar putea să nu funcționeze cum era de așteptat, deoarece în vedere SwiftUI sunt structs, ceea ce înseamnă că acestea sunt transmise prin valoare, astfel copiat de fiecare dată când sunt circulat. În final, ajungi cu multiple, distincte ChildView cazuri, deci s-ar putea sfârși prin apelarea funcției copilului pe un alt punct de vedere decât cel pe care îl așteptam.
Cristik

@Cristik da cred că acest lucru este dreptul de a crea mai multe instanțe pentru fiecare copil vedere apel. Pentru că se comportă în mod diferit pentru fiecare apariție.
Raja Kishan

În alte limbi

Această pagină este în alte limbi

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