Я хочу вызвать childFunction() demo childView, нажав кнопку в родительском представлении.
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()
}
}
Обновить: Спасибо @RajaKishan, это работает, но мне нужно, чтобы он работал также рекурсивно
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()
}
}
Возможно, это не самый красивый пример, но вопрос в том, как заставить кнопку запустить функцию ее дочернего элемента после того, как пользователь посетил соответствующего ребенка.
Например, при запуске, когда пользователь нажимает кнопку, он печатает "Это представление является родительским". После того, как пользователь перейдет к child1, нажатие кнопки должно вывести "Это представление является Child1", как и так далее. Таким образом, на функцию, которую запускает кнопка, следует ссылаться с последнего дочернего элемента.
Обновить: В конце концов я написал это решение.
Обновить: Я получил обратную связь, в которой меня просили дать разъяснения. Без проблем. Я надеюсь, что это кому-нибудь поможет.:)
Осветление: Я не включал весь код целиком, просто использовал простой пример. Но мне это было нужно при реализации древовидного сгенерированного меню: когда у каждого элемента в меню есть или нет своих дочерних элементов. При нажатии на родительский объект пользователь переходит в дочерние объекты. И здесь мне нужно было иметь возможность вернуться от дочернего объекта к родительскому, но вызвать эту функцию отклонения от родительского объекта. Для этого я использовал следующий код и ссылался на эту функцию для каждого родительского объекта:
@Environment(\.presentationMode) var presentationMode
presentationMode.wrappedValue.dismiss()