SwiftUI Picker падает при отображении через NavigationLink - PullRequest
2 голосов
/ 14 января 2020

У кого-нибудь есть обходной путь для следующего cra sh?

У меня есть форма, которая отображается через NavigationLink в родительском контроллере навигации, например:

    var body: some View {
        NavigationView {
            NavigationLink(destination: PickerView()) {
                Text("Picker View")
            }
        }
    }

PickerView имеет три сборщика. Первый определяет, какой из остальных отображается:

struct PickerView: View {
    @State var sectionValue = "pet"
    @State var petValue = "dog"
    @State var fruitValue = "apple"
    @State var foodValue = "pasta"
    var body: some View {

        Form {

            Picker(selection: $sectionValue, label: Text("What is your favorite?")) {
                Text("Pet").tag("pet")
                Text("Fruits").tag("fruits")
                Text("Foods").tag("foods")
            }

            if (sectionValue == "pet") {
                Picker(selection: $petValue, label: Text("Favorite pet")) {
                    Text("Dog").tag("dog")
                    Text("Cat").tag("cat")
                    Text("Lizard").tag("lizard")
                }
            } else if (sectionValue == "fruits") {
                Picker(selection: $fruitValue, label: Text("Favorite fruit")) {
                    Text("Apple").tag("apple")
                    Text("Pear").tag("pear")
                    Text("Orange").tag("orange")
                }
            } else if (sectionValue == "foods") {
                Picker(selection: $foodValue, label: Text("Favorite food")) {
                    Text("Pasta").tag("pasta")
                    Text("Ice Cream").tag("ice_cream")
                    Text("Bacon").tag("bacon")
                }
            }
        }
    }
}

В симуляторе (и устройстве) iOS 13.3 я вижу следующее поведение: переход к PickerView и выбор альтернативного значения для первого средства выбора скроет 2-й сборщик и покажет 3-й сборщик, как и ожидалось. Однако если вы работаете с третьим средством выбора, оно будет отображаться с пустыми значениями ... вскоре за ним будет отображаться cra sh.

cra sh показывает трассировку стека с сотнями вызовов [UINavigationController _navigationBar: itemEnabledAutoScrollTransition:]

Я думаю, что это ошибка Apple. Я подал FB7534235, но я хотел посмотреть, есть ли у кого-нибудь обходные пути или предложения?

Одним из вариантов является использование .disabled () для отключения (а не скрытия) средства выбора, но это приводит к более запутанному пользовательскому интерфейсу.

Примечание : Похоже, что это взаимодействие с NavgiationView () / NagivationLink () и Picker () - потому что если вы закомментируете NagivationLink и визуализируете PickerView непосредственно в NavigationView, все работает, как и ожидалось, без сбоев.

update : пример обновления обновлен, чтобы сделать его трехсторонним выбором для вспомогательных сборщиков. Благодаря @krjw, приведенному ниже, указывается, что в двустороннем случае вместо двух отдельных используется "else if" if-операторы могут привести к желаемому поведению без cra * sh ... хотя я до сих пор не уверен, почему (если это не просто ошибка)

Ответы [ 2 ]

2 голосов
/ 14 января 2020

Я протестировал это с Xcode 11.3.1 на iPad Pro под управлением iPadOS 13.3. Я получил странное поведение при перезагрузке, когда выбирал что-то в первом сборщике, а затем выбирал снова, но без cra * sh.

. Я мог повторить cra sh на моем iPhone.

* 1004. * Добавление else во второе предложение if исправляет это!

Таким образом, решение заключается в следующем коде:

struct PickerView: View {
    @State var sectionValue = "phonetic"
    @State var phoneticValue = "alpha"
    @State var fruitValue = "apple"

    var body: some View {

        Form {

            Picker(selection: $sectionValue, label: Text("Pick a Section")) {
                Text("Phonetic Alphabet").tag("phonetic")
                Text("Fruits").tag("fruits")
            }

            if (sectionValue == "phonetic") {
                Picker(selection: $phoneticValue, label: Text("Pick a letter")) {
                    Text("Alpha").tag("alpha")
                    Text("Bravo").tag("bravo")
                    Text("Charlie").tag("charlie")
                }
            }
            else if (sectionValue == "fruits") {
                Picker(selection: $fruitValue, label: Text("Pick a fruit")) {
                    Text("Apple").tag("apple")
                    Text("Pear").tag("pear")
                    Text("Orange").tag("orange")
                }
            }
        }
    }
}

struct ContentView: View {

    var body: some View {
        NavigationView {
            NavigationLink(destination: PickerView()) {
                Text("Picker View")
            }
        }
    }
}

Надеюсь, это поможет!

0 голосов
/ 20 января 2020

Я остановился на той же проблеме, и поставить «иначе, если» не помогло. Я понял, что cra sh появляется, когда у меня есть navigationBarItems где-то за пределами вида, где появляется Picker.

Поэтому в качестве обходного пути я переместил Picker в sheet() и поместил navigationBarItems в том же виде.

Жаль, что у них такие сумасшедшие ошибки.

...