SwiftUI - Прерывистый cra sh при представлении листа на листе - PullRequest
0 голосов
/ 04 мая 2020

У меня есть cra sh, который непредсказуемо происходит, когда я представляю лист поверх вида, который уже находится в листе. Я смог постепенно отделить части своего вида и пользовательских типов, пока не получил очень простую и общую структуру вида c ниже, которая все еще демонстрирует cra sh.

cra sh происходит, когда я взаимодействую с TextField, а затем взаимодействую с одной из кнопок, которая показывает вложенный лист. Иногда требуется много нажатий между кнопками и текстовым полем, чтобы вызвать cra sh, а иногда это происходит сразу (как в GIF ниже). Иногда я не могу заставить cra sh произойти вообще, но мои пользователи продолжают сообщать об этом.

В gif ниже cra * sh появляется в момент, когда нажата нижняя кнопка. Вы можете видеть, что кнопка никогда не выходит из своего «нажатого» состояния и лист никогда не появляется.

XCode не дает никакой полезной информации о cra sh (скриншоты включены ниже).

Я получил это только на iPhone XR, работающем 13.4.1 и Xcode 11.4.1. Я пробовал на iPhone 6 и нескольких симуляторах и не могу запустить cra sh, но пользователи сообщили об этом на нескольких устройствах.

struct ContentView: View {

    @State var showingSheetOne: Bool = false

    var body: some View {
        Button(action: { self.showingSheetOne = true }) {
            Text("Show")
        }
        .sheet(isPresented: $showingSheetOne) {
            SheetOne(showingSheetOne: self.$showingSheetOne)
        }
    }
}

struct SheetOne: View {

    @Binding var showingSheetOne: Bool
    @State var text = ""

    var body: some View {
        VStack {
            SheetTwoButton()
            SheetTwoButton()
            SheetTwoButton()
            TextField("Text", text: self.$text)
        }
    }

}

struct SheetTwo: View {

    @Binding var showing: Bool

    var body: some View {
        Button(action: {
            self.showing = false
        }) {
            Text("Hide")
                .frame(width: 300, height: 100)
                .foregroundColor(.white)
                .background(Color.blue)
        }
    }

}

struct SheetTwoButton: View  {

    @State private var showSheetTwo: Bool = false

    var body: some View {
        Button(action: { self.showSheetTwo = true } ) {
            Image(systemName: "plus.circle.fill")
                .font(.headline)
        }.sheet(isPresented: self.$showSheetTwo) {
            SheetTwo(showing: self.$showSheetTwo)
        }
    }

}

Crash screen recording Xcode Crash 01 Xcode Crash 02 Xcode Crash 03 Xcode Crash 04

1 Ответ

1 голос
/ 05 мая 2020

Я столкнулся с подобной проблемой через несколько недель go. Оказывается, что когда я представляю новый лист с открытой клавиатурой, это может привести к взлому sh.

. Я обнаружил, что использование UIApplication.shared.endEditing() перед тем, как показывать второй лист, решит проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...