SwiftUI Picker аварийно завершает работу при отображении через NavigationLink
Есть ли у кого-нибудь способ обхода следующего сбоя?
У меня есть форма, которая отображается через 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 и выбор альтернативного значения для первого средства выбора скроет второе средство выбора и покажет 3 средство выбора, как и ожидалось. Однако, если вы используете 3-й сборщик, он будет отображаться с пустыми значениями... вскоре после этого произойдет сбой.
При сбое отображается трассировка стека с сотнями вызовов [UINavigationController _navigationBar:itemEnabledAutoScrollTransition:]
Думаю, это ошибка Apple. Я подал FB7534235, но хотел узнать, есть ли у кого-нибудь обходные пути или предложения?
Один из вариантов - использовать.disabled() для отключения (а не скрытия) средства выбора, но это приводит к более запутанному пользовательскому интерфейсу.
Боковое примечание: похоже, это взаимодействие с NavgiationView()/NagivationLink() и Picker() - потому что, если вы закомментируете NagivationLink и визуализируете PickerView непосредственно в NavigationView, все будет работать, как ожидалось, без сбоев.
update: обновлен пример случая, чтобы сделать его трехсторонним выбором для вспомогательных средств выбора. Благодаря @krjw ниже, указывающему на то, что в двустороннем случае "else if" вместо двух отдельных операторов if может дать желаемое поведение без сбоев... хотя я все еще не уверен, почему (если это не "просто ошибка")
2 ответа
Я тестировал это с Xcode 11.3.1 на iPad Pro под управлением iPadOS 13.3. У меня было странное поведение перезагрузки, когда я выбирал что-то в первом сборщике, а затем выбирал снова, но без сбоев.
Я мог воспроизвести сбой на моем iPhone.
Добавление 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")
}
}
}
}
Надеюсь, это поможет!
Я застрял на той же проблеме, и добавление "иначе, если" не помогло. Я понял, что сбой возникает, когда яnavigationBarItems
где-то вне поля зрения, где Picker
появляется.
Поэтому в качестве обходного пути я переместил Picker
в sheet()
и положи navigationBarItems
на том же взгляде.
Жалко, что у них такие сумасшедшие ошибки.