onDisappear не вызывается при отклонении модального вида - PullRequest
2 голосов
/ 29 февраля 2020

Я полагаюсь на SwiftUI .onDisappear для выполнения некоторой логики c, но она не вызывается, когда пользователь отклоняет модально представленное представление жестом смахивания. Воспроизвести

  • Представить модально представление "ChildView 1"
  • . В этом представлении pu sh a "ChildView 2" в качестве дочернего элемента навигации
  • Swipe вниз, чтобы закрыть модальное представление.

.onDisappear "ChildView 2" не вызывается.

Пример кода для воспроизведения

import SwiftUI

struct ContentView: View {
    @State var isShowingModal
    var body: some View {
        NavigationView {
            Button(action: {
                self.isShowingModal.toggle()
            }) {
                Text("Show Modal")
            }
        }
        .sheet(isPresented: $isShowingModal) {
            NavigationView {
                ChildView(title: 1)
            }
        }
    }
}

struct ChildView: View {
    let title: Int
    var body: some View {

        NavigationLink(destination: ChildView(title: title + 1)) {
            Text("Show Child")
        }
        .navigationBarTitle("View \(title)")


        .onAppear {
            print("onAppear ChildView \(self.title)")
        }
        .onDisappear {
            print("onDisappear ChildView \(self.title)")
        }
    }
}

Вывод:

onAppear ChildView 1
onAppear ChildView 2
onDisappear ChildView 1

enter image description here

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020
struct ContentView: View {
    @State var isShowingModal = false
    var body: some View {
        NavigationView {
            Button(action: {
                self.isShowingModal.toggle()
            }) {
                Text("Show Modal")
            }
        }
        .sheet(isPresented: $isShowingModal) {
            NavigationView {
                ChildView(title: 1)
            }
        }
    }
}

в этом коде у вас есть NavigationView, а при представлении листа у вас есть sh другой NavigationView. Это источник неприятностей

Вам не нужен NavigationView для представления модальностей. Если вы хотите представить еще один модальный модал, вы можете использовать

import SwiftUI

struct ContentView: View {
    var body: some View {
         ChildView(title: 1)
    }
}

struct ChildView: View {
    @State var isShowingModal = false
    let title: Int
    var body: some View {

        Button(action: {
                self.isShowingModal.toggle()
            }) {
                Text("Show Modal \(title)").font(.largeTitle)
            }
        .sheet(isPresented: $isShowingModal) {
            ChildView(title: self.title + 1)

        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

enter image description here

ОБНОВЛЕНИЕ

от Apple Human Рекомендации по интерфейсу

Модальность - это метод проектирования, который представляет контент во временном режиме, который отделен от предыдущего текущего контекста пользователя и требует явного действия для выхода

0 голосов
/ 29 февраля 2020

Если вы ищете, чтобы логика c возникала, когда фактический модал отклонен, вы захотите вызвать его здесь, где я распечатываю Modal Dismissed:

struct ContentView: View {
    @State var isShowingModal = false
    var body: some View {
        NavigationView {
            Button(action: {
                self.isShowingModal.toggle()
            }) {
                Text("Show Modal")
            }
        }
        .sheet(isPresented: $isShowingModal) {
            NavigationView {
                ChildView(title: 1)
            }
            .onDisappear {
                print("Modal Dismissed")
            }
        }
    }
}
...