SwiftUI 选取器在通过 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 模拟器(和设备(中,我看到以下行为:导航到选取器视图并选择第一个选取器的备用值将隐藏第二个选取器并显示第三个选取器,如预期的那样。 但是,如果您操作第 3 个选取器,它将以空白值显示......紧接着是一阵崩溃。

崩溃显示堆栈跟踪,其中数百次调用 [UINavigationController _navigationBar:itemEnabledAutoScrollTransition:]

我认为这是一个苹果错误。 我已经提交了FB7534235但我想看看是否有人有任何解决方法或建议?

一种选择是使用 .disabled(( 禁用(而不是隐藏(选取器,但这会导致用户界面更加混乱。

旁注:这似乎是与 NavgiationView((/NagivationLink(( 和 Picker(( 的交互——因为如果你注释掉 NagivationLink 并直接在 NavigationView 中渲染 PickerView,一切都按预期工作而不会崩溃。

更新:更新了示例案例,使其成为子选择器的 3 向选择。感谢下面的@krjw指出,在双向情况下,"else if"而不是两个单独的 if 语句可以产生所需的行为而不会崩溃......虽然我仍然不确定为什么(除非是,"只是一个错误"(

我在运行iPadOS 13.3的iPad Pro上使用Xcode 11.3.1对此进行了测试。在第一个选择器中选择某些东西然后再次选择时,我遇到了奇怪的重新加载行为,但没有崩溃。

我可以在我的iPhone上复制崩溃。

在第二个if子句上添加else可以解决这个问题!

因此,解决方案是以下代码:

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")
}
}
}
}

我希望这有帮助!

我坚持同样的问题,并输入"else if"没有帮助。我意识到的是,当我navigationBarItems出现在Picker视图之外的某个地方时,就会出现崩溃。

因此,作为解决方法,我Picker移动到sheet()中,并将navigationBarItems放在同一个视图上。

可惜他们有如此疯狂的错误。

最新更新