簡體   English   中英

SwiftUI:如果在 ForEach 中使用,NavigationLink 會立即彈出

[英]SwiftUI: NavigationLink pops immediately if used within ForEach

我在列表中的 ForEach 內部使用 NavigationLink 來構建一個基本的按鈕列表,每個按鈕都指向一個單獨的詳細信息屏幕。

當我點擊任何列表單元格時,它會轉換到該單元格的詳細視圖,但隨后會立即彈出回到主菜單屏幕。

不使用 ForEach 有助於避免這種行為,但並不理想。

這是相關代碼:

struct MainMenuView: View {

    ...

    private let menuItems: [MainMenuItem] = [
        MainMenuItem(type: .type1),
        MainMenuItem(type: .type2),
        MainMenuItem(type: .typeN),
    ]

    var body: some View {
        List {
            ForEach(menuItems) { item in
                NavigationLink(destination: self.destination(item.destination)) {
                    MainMenuCell(menuItem: item)
                }
            }
        }
    }

    // Constructs destination views for the navigation link
    private func destination(_ destination: ScreenDestination) -> AnyView {
        switch destination {
        case .type1:
            return factory.makeType1Screen()
        case .type2:
            return factory.makeType2Screen()
        case .typeN:
            return factory.makeTypeNScreen()
        }
    }

如果MainMenuView中有@State@Binding@ObservedObject ,則主體本身會重新生成( menuItems會再次計算),這會導致NavigationLink無效(實際上是id更改會這樣做)。 因此,您不得從詳細視圖中修改menuItems arrays id -s。

如果每次都生成它們,請考慮設置一個常量 id 或存儲在非修改部分中,例如在視圖模型中。

也許我找到了這個錯誤的原因......

如果您使用 iOS 15(未找到 iOS 14),並且將代碼 NavigationLink 寫入 go 到項目中不同位置的相同視圖,則會出現此錯誤。

所以我簡單地制作了另一個具有不同目標視圖名稱但相同內容的視圖......然后它就可以工作了......

你可以試試....

對不起我糟糕的英語......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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