Метод .onDisappear () не запускается при нажатии NavigationLink, SwiftUI - PullRequest
0 голосов
/ 21 апреля 2020
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?

1 Ответ

0 голосов
/ 21 апреля 2020

Это то, как это должно работать, потому что ваш DetailView - это подпредставление вашего MainView, если вы используете NavigationLink. Вот почему ваш 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")
    }
}
...