在推送视图中修改列表绑定属性时,SwiftUI 导航会弹出

lac*_*her 12 swiftui swiftui-navigationlink swiftui-navigationview

当我从向下推 2+ 层的视图中的数组更新绑定属性时,导航会在属性更改后立即弹出。

Xcode 13.3 测试版、iOS 15。

我创建了一个简单的演示,代码如下。

购物清单 列表编辑 列表部分编辑
购物清单视图 购物清单编辑视图 购物清单编辑部分查看

更新列表标题(一个视图深)就可以了,导航堆栈保持不变,如果我返回,更改就会发布。但是,当调整部分标题(两层深)时,只要我对属性进行一次更改,导航就会弹出。

我有一种感觉,我在这里缺少基本的基础知识,而且我有一种感觉,它一定与列表有关id?但我正在努力弄清楚或解决它。

动图

例子

代码:

楷模:

struct ShoppingList {
    let id: String = UUID().uuidString
    var title: String
    var sections: [ShoppingListSection]
}

struct ShoppingListSection {
    let id: String = UUID().uuidString
    var title: String
}

Run Code Online (Sandbox Code Playgroud)

查看型号:

final class ShoppingListsViewModel: ObservableObject {
    @Published var shoppingLists: [ShoppingList] = [
        .init(
            title: "Shopping List 01",
            sections: [
                .init(title: "Fresh food")
            ]
        )
    ]
}
Run Code Online (Sandbox Code Playgroud)

内容查看:

struct ContentView: View {
    var body: some View {
        NavigationView {
            ShoppingListsView()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

购物清单视图

struct ShoppingListsView: View {
    @StateObject private var viewModel = ShoppingListsViewModel()

    var body: some View {
        List($viewModel.shoppingLists, id: \.id) { $shoppingList in
            NavigationLink(destination: ShoppingListEditView(shoppingList: $shoppingList)) {
                Text(shoppingList.title)
            }
        }
        .navigationBarTitle("Shopping Lists")
    }
}
Run Code Online (Sandbox Code Playgroud)

购物清单编辑视图

struct ShoppingListEditView: View {
    @Binding var shoppingList: ShoppingList

    var body: some View {
        Form {
            Section(header: Text("Title")) {
                TextField("Title", text: $shoppingList.title)
            }
            Section(header: Text("Sections")) {
                List($shoppingList.sections, id: \.id) { $section in
                    NavigationLink(destination: ShoppingListSectionEditView(section: $section)) {
                        Text(section.title)
                    }
                }
            }
        }
        .navigationBarTitle("Edit list")
    }
}
Run Code Online (Sandbox Code Playgroud)

购物列表部分编辑视图

struct ShoppingListSectionEditView: View {
    @Binding var section: ShoppingListSection

    var body: some View {
        Form {
            Section(header: Text("Title")) {
                TextField("title", text: $section.title)
            }
        }
        .navigationBarTitle("Edit section")
    }
}

Run Code Online (Sandbox Code Playgroud)

wor*_*dog 24

试试这个,对我有用:

struct ContentView: View {
    var body: some View {
        NavigationView {
            ShoppingListsView()
        }.navigationViewStyle(.stack)  // <--- here
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是我的一半问题。当我注意到弹出仅发生在 ForEach 内创建的视图时,我解决了另一个问题。我没有使用 UUID() 作为对象的 id,而是将其更改为另一个属性 PK,这修复了它。 (4认同)
  • 也不适合我..iOS 15.4 (3认同)
  • 在互联网上搜索了几个小时,直到我找到了这个。这个答案需要更多的关注。 (2认同)
  • 不适合我。还尝试了 NavigationLink 中的 isDetailLink(false) ,也不起作用。iOS 15。 (2认同)