SwiftUI:如果在ForEach中使用,NavigationLink将立即弹出

问题描述 投票:1回答:1

我正在使用列表中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()
        }
    }
ios swift watchkit swiftui
1个回答
2
投票

[如果您在@State中具有@Binding@ObservedObjectMainMenuView,则主体本身会重新生成(再次计算menuItems),这会使NavigationLink无效(实际上是id更改)做到这一点)。因此,您不得从详细信息视图中修改menuItems数组id -s。

如果它们每次都生成,请考虑设置一个常量id或将其存储在非修改部分中,例如在viewmodel中。

© www.soinside.com 2019 - 2024. All rights reserved.