如何使用NavigationLink编辑列表中的项目?

时间:2019-11-22 15:25:48

标签: list swiftui navigationlink

我正在寻找SwiftUI的一些指导。

我有一个视图,显示一个简单的列表,每行显示一个“名称”字符串。您可以通过单击尾随的导航栏按钮将项目添加到阵列/列表中。这很好。现在,我想使用NavigationLink呈现一个新的“ DetailView”,在其中可以编辑行的“名称”字符串。我正在努力使用在detailview中使用绑定来更新名称。

我在网上找到了大量关于如何在新视图中显示数据的教程,但是却没有关于如何编辑数据的教程。 预先感谢。

ContentView:

struct ListItem: Identifiable {
    let id = UUID()
    let name: String
}

class MyListClass: ObservableObject {
    @Published var items = [ListItem]()
}

struct ContentView: View {

    @ObservedObject var myList = MyListClass()

    var body: some View {
        NavigationView {
            List {
                ForEach(myList.items) { item in
                    NavigationLink(destination: DetailView(item: item)) {
                        Text(item.name)
                    }
                }
            }
            .navigationBarItems(trailing:
                Button(action: {
                    let item = ListItem(name: "Test")
                    self.myList.items.append(item)
                }) {
                    Image(systemName: "plus")
                }
            )
        }
    }
}

DetailView

struct DetailView: View {

    var item: ListItem

    var body: some View {
        TextField("", text: item.name)
    }
}

1 个答案:

答案 0 :(得分:1)

传递给DetailsView的主要思想不是复制项目,而是复制项目,因为它是一个值,但绑定到视图模型中的相应项目。

这是一个演示示例,其中修改了代码快照以实现所需的行为:

struct ListItem: Identifiable, Equatable {
    var id = UUID()
    var name: String
}

class MyListClass: ObservableObject {
    @Published var items = [ListItem]()
}

struct ContentView: View {

    @ObservedObject var myList = MyListClass()

    var body: some View {
        NavigationView {
            List {
                ForEach(myList.items) { item in
                    // Pass binding to item into DetailsView
                    NavigationLink(destination: DetailView(item: self.$myList.items[self.myList.items.firstIndex(of: item)!])) {
                        Text(item.name)
                    }
                }
            }
            .navigationBarItems(trailing:
                Button(action: {
                    let item = ListItem(name: "Test")
                    self.myList.items.append(item)
                }) {
                    Image(systemName: "plus")
                }
            )
        }
    }
}

struct DetailView: View {

    @Binding var item: ListItem

    var body: some View {
        TextField("", text: self.$item.name)
    }
}