![](/img/trans.png)
[英]App crashes when SwiftUI view with Picker disappears (since iOS 16)
[英]SwiftUI Picker crashes when displayed via 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 个选择器,它将显示为空白值……然后很快就会崩溃。
崩溃显示了一个堆栈跟踪,其中包含对 [UINavigationController _navigationBar:itemEnabledAutoScrollTransition:] 的数百次调用
我认为这是Apple的错误。 我已提交 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")
}
}
}
}
我希望这有帮助!
我坚持同样的问题,并把“否则如果”没有帮助。 我意识到当我在Picker
出现的视图之外的某处有navigationBarItems
时,会出现崩溃。
因此,作为一种解决方法,我将Picker
移到sheet()
并将navigationBarItems
放在同一个 View 上。
很遗憾他们有如此疯狂的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.