【问题标题】:How to edit an item in a list using NavigationLink?如何使用 NavigationLink 编辑列表中的项目?
【发布时间】:2020-03-18 16:52:53
【问题描述】:

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

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

我在网上找到了大量关于如何在新视图中呈现数据的教程,但没有关于如何编辑数据的教程。 提前致谢。

内容视图:

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")
                }
            )
        }
    }
}

详细视图

struct DetailView: View {

    var item: ListItem

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

【问题讨论】:

    标签: list swiftui navigationlink


    【解决方案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)
        }
    }
    

    【讨论】:

    • 谢谢!我只花了 2 天的时间才意识到做 ForEach(0..<list.count) 根本不起作用。我的意思是,当您将其视为 静态范围 中的列表时,它是有道理的..跨度>
    • 这仍然是我能在网上找到的唯一一个用一个简单的例子清楚地解释这个概念的地方之一。解决了我的问题并节省了我更多的搜索时间。
    • 这会产生Cannot assign through subscript: subscript is get-only
    猜你喜欢
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多