通过NavigationLink显示时,SwiftUI Picker崩溃

时间:2020-01-14 12:10:07

标签: ios swift swiftui swiftui-navigationlink swiftui-picker

有人能解决以下崩溃问题吗?

我有一个通过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,则所有内容可以正常工作而不会崩溃。

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

1 个答案:

答案 0 :(得分:2)

我在运行iPadOS 13.3的iPad Pro上使用Xcode 11.3.1进行了测试。在第一个选择器中选择某项然后再次选择但没有崩溃时,出现了奇怪的重载行为。

我可以在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")
            }
        }
    }
}

我希望这会有所帮助!