单击 NavigationLink、SwiftUI 时不会触发 .onDisappear() 方法
.onDisappear() method isn't triggered when clicking the NavigationLink, SwiftUI
NavigationView {
List{
ForEach(self.data.firebaseObj.lists, id: \.self) { item in
NavigationLink(
destination: DetailView(
list: item,
listIndex: self.data.firebaseObj.lists.firstIndex(of: item) ?? -1
).environmentObject(self.data)
){
Text(item.name)
}
}
.onDelete(perform: delete)
}
.navigationBarTitle(Text("Le liste").font(.largeTitle), displayMode: .inline)
.navigationBarItems(
leading: SignOutButton(),
trailing: Button(action: {
self.show_modal = true
}) {Image(systemName: "plus")}.sheet(isPresented: self.$show_modal) {
AddListForm(email: self.session.session!.email!).environmentObject(self.data)
})
}.onAppear(
perform:{
self.data.createList(username: self.session.session!.email!)
})
.onDisappear(
perform: {
self.data.listener.remove()
print("should be removed")
})
这就是我的代码,如标题中所写,单击 NavigationLink 不会触发 .onDisappear() 方法。相反,更改为另一个选项卡视图效果很好。我做错了什么还是这只是它应该工作的方式?在第二种情况下,是否有一种简单的方法可以在单击 NavigationLink 时执行一些代码?
它应该是这样工作的,因为如果您使用 NavigationLink,您的 DetailView 是 MainView 的子视图。这就是为什么您的 MainView 并没有真正以编程方式消失的原因。
不过你可以这样做:
struct ContentView: View {
@State private var showDetailView = false
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: DetailView(), isActive: $showDetailView) {
Button(action: {
print("should be removed")
self.showDetailView = true
}, label: {
Text("Listitem")
})
}
Spacer()
}.navigationBarTitle(Text("MainView"))
}
}
}
struct DetailView: View {
var body: some View {
Text("DetailView")
}
}
NavigationView {
List{
ForEach(self.data.firebaseObj.lists, id: \.self) { item in
NavigationLink(
destination: DetailView(
list: item,
listIndex: self.data.firebaseObj.lists.firstIndex(of: item) ?? -1
).environmentObject(self.data)
){
Text(item.name)
}
}
.onDelete(perform: delete)
}
.navigationBarTitle(Text("Le liste").font(.largeTitle), displayMode: .inline)
.navigationBarItems(
leading: SignOutButton(),
trailing: Button(action: {
self.show_modal = true
}) {Image(systemName: "plus")}.sheet(isPresented: self.$show_modal) {
AddListForm(email: self.session.session!.email!).environmentObject(self.data)
})
}.onAppear(
perform:{
self.data.createList(username: self.session.session!.email!)
})
.onDisappear(
perform: {
self.data.listener.remove()
print("should be removed")
})
这就是我的代码,如标题中所写,单击 NavigationLink 不会触发 .onDisappear() 方法。相反,更改为另一个选项卡视图效果很好。我做错了什么还是这只是它应该工作的方式?在第二种情况下,是否有一种简单的方法可以在单击 NavigationLink 时执行一些代码?
它应该是这样工作的,因为如果您使用 NavigationLink,您的 DetailView 是 MainView 的子视图。这就是为什么您的 MainView 并没有真正以编程方式消失的原因。
不过你可以这样做:
struct ContentView: View {
@State private var showDetailView = false
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: DetailView(), isActive: $showDetailView) {
Button(action: {
print("should be removed")
self.showDetailView = true
}, label: {
Text("Listitem")
})
}
Spacer()
}.navigationBarTitle(Text("MainView"))
}
}
}
struct DetailView: View {
var body: some View {
Text("DetailView")
}
}