SwiftUI cra sh: «SheetBridge: обнаружена брошенная презентация» при закрытии представления листа (которое запускается другим представлением листа) - PullRequest
1 голос
/ 07 августа 2020

Xcode 12 beta 4

У меня есть ContentView с двумя разными модальными представлениями. Я хочу использовать sheet(isPresented: onDismiss: content:) для отображения первого представления, когда оно закрыто, автоматически отображается второе представление.

Это мой код

struct ContentView: View {
    @State var showFirst = false
    @State var showSecond = false

    var body: some View {
        VStack(spacing: 20) {
            Text("showFirst: \(showFirst.description)")
            Text("showSecond: \(showSecond.description)")

            Button("show") {
                showFirst.toggle()
            }
            .sheet(isPresented: $showFirst) {
                showSecond.toggle()
            } content: {
                FirstView(isPresented: $showFirst)
            }

            Text("")
                .sheet(isPresented: $showSecond) {
                    SecondView(isPresented: $showSecond)
                }

        }

    }
}

struct FirstView: View {
    @Binding var isPresented: Bool

    var body: some View {
        VStack {
            Button("close") {
                isPresented = false
            }
            Text("First View")
        }
    }
}

struct SecondView: View {
    @Binding var isPresented: Bool

    var body: some View {
        VStack {
            Button("close") {
                isPresented = false
            }
            Text("Second View")
        }
    }
}

Затем я запускаю код. Если я закрою виды модели жестом перетаскивания вниз, все заработает. Если я закрою первое представление, нажав кнопку закрытия, оно выйдет из строя при закрытии второго представления и выдаст фатальную ошибку:

Неустранимая ошибка: SheetBridge: обнаружена брошенная презентация: файл SwiftUI, строка 0

Мое недоразумение

Похоже, что если нажать кнопку закрытия первого представления и в любом случае закрыть второе представление, $showSecond не изменилось на false.

Есть ли разница между перетаскиванием вниз и ручным переключением $ isPresent?

И если я использую presentationMode.wrappedValue.dismiss() вместо привязки isPredented, он тоже вылетает.

1 Ответ

1 голос
/ 07 августа 2020

Исправление состоит в том, чтобы отображать второй лист с битовой задержкой, чтобы дать возможность для первого листа завершить sh полностью.

Протестировано с Xcode 12 / iOS 14

Button("show") {
    showFirst.toggle()
}
.sheet(isPresented: $showFirst) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {    // << here !!
        showSecond.toggle()
    }
} content: {
    FirstView(isPresented: $showFirst)
}
...