Jak uruchomić tę funkcję od rodzica?

0

Pytanie

Chcę wywołać childFunction() demo childView, naciskając przycisk w odbiorniku widoku.

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

Odśwież: Dziękuję @RajaKishan, to działa, ale ja chcę, aby on pracował także rekurencyjnie

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

Być może nie jest to najpiękniejszy przykład, ale pytanie brzmi, jak zrobić przycisk uruchom funkcję jej elementu podrzędnego po tym, jak użytkownik odwiedził odpowiedniej dziecka.

Na przykład, po uruchomieniu, gdy użytkownik kliknie przycisk, drukuje "To przedstawienie jest nadrzędnym". Po tym, jak użytkownik przejdzie do child1, naciśnięcie przycisku powinno się wyprowadzić "To przedstawienie jest Child1", jak i tak dalej. W ten sposób, na funkcję, którą uruchamia przycisk, należy odwołać z ostatniego elementu podrzędnego.

Odśwież: W końcu napisałem to rozwiązanie.

Odśwież: Dostałem informację zwrotną, w której miałem dać wyjaśnienia. Bez problemów. Mam nadzieję, że to komuś pomoże.:)

Rozjaśnianie: Nie obejmował cały kod w całości, po prostu wykorzystał prosty przykład. Ale było mi to potrzebne przy realizacji drzewo wygenerowanego przez menu: kiedy u każdego elementu w menu lub jego elementów podrzędnych. Po kliknięciu na obiekt nadrzędny użytkownik przechodzi do obiektów podrzędnych. I tu trzeba było mieć możliwość powrotu od obiektu podrzędnego do nadrzędnego, ale wywołać tę funkcję odchylenia od obiektu nadrzędnego. Użyłem do tego poniższy kod i powołał na tę funkcję dla każdego obiektu nadrzędnego:

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

Najlepsza odpowiedź

1

Można utworzyć obiekt podrzędny prezentacji.

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


ZMIANY : Do listy można użyć tablicy modelu i powodować docelową funkcję indeksu.

Oto prosty przykład "dziecko-rodzic".

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
}

Uwaga: trzeba indeksować wiersz, aby wywołać tę funkcję.

2021-11-24 07:34:52

Witam. Dziękuję za odpowiedź. To działa. Ale w przypadku rekurencyjne struktury prezentacji, gdy w contentView są elementy potomne contentView, utworzone za pomocą łącza nawigacji, jak można to rozwiązać, ponieważ typ wartości nie może mieć zapisaną właściwość, która rekurencyjnie zawiera go ?
Degtiarev Aleksei

@DegtiarevAleksei nie mógłbyś, proszę, dodaj jeden przykład do twojego pytania?
Raja Kishan

Zaktualizowałem pytanie
Degtiarev Aleksei

@DegtiarevAleksei dodałem część edycji. To może być przydatne.
Raja Kishan

Dziękuję za odpowiedź, ale po tym, jak skompilował przycisk, ona zawsze zwraca "To przedstawienie jest partnerem 2".
Degtiarev Aleksei

@DegtiarevAleksei To dlatego, że zainstalowałem indeks 1 (arrData[1]) w akcji przycisku. przeczytaj moją notkę.
Raja Kishan

To nie może działać tak, jak oczekiwano, ponieważ występ w SwiftUI są strukturami, co oznacza, że są one przekazywane przez wartość i w ten sposób są kopiowane za każdym razem, gdy ich dystrybucji. W końcu, masz kilka różnych ChildView egzemplarze, więc może w końcu wywołać tę funkcję w innym widoku, niż to, które można oczekiwać.
Cristik

@Cristik tak, myślę, że poprawnie tworzyć kilka egzemplarzy dla każdego połączenia podrzędnego prezentacji. Bo on zachowuje się inaczej dla każdego przypadku.
Raja Kishan

W innych językach

Ta strona jest w innych językach

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