如何使用 NavigationLink 编辑列表中的项目?
How to edit an item in a list using NavigationLink?
我正在寻找有关 SwiftUI 的一些指导。
我有一个显示简单列表的视图,每行显示一个 "name" 字符串。您可以通过单击尾部导航栏按钮将项目添加到 array/list。这很好用。我现在想使用 NavigationLink 来呈现一个新的 "DetailView",我可以在其中编辑该行的 "name" 字符串。我正在为如何在详细视图中使用绑定来更新名称而苦苦挣扎。
我在网上找到了很多关于如何在新视图中显示数据的教程,但没有关于如何编辑数据的教程。
提前致谢。
内容视图:
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)
}
}
你传入 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)
}
}
我正在寻找有关 SwiftUI 的一些指导。
我有一个显示简单列表的视图,每行显示一个 "name" 字符串。您可以通过单击尾部导航栏按钮将项目添加到 array/list。这很好用。我现在想使用 NavigationLink 来呈现一个新的 "DetailView",我可以在其中编辑该行的 "name" 字符串。我正在为如何在详细视图中使用绑定来更新名称而苦苦挣扎。
我在网上找到了很多关于如何在新视图中显示数据的教程,但没有关于如何编辑数据的教程。 提前致谢。
内容视图:
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)
}
}
你传入 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)
}
}