簡體   English   中英

SwiftUI Picker 在通過 NavigationLink 顯示時崩潰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM