不向数组追加新数据
Not append new data to an array
我想将新数据添加到我项目的列表中
但我做不到
我有一个 ContentView.swift 视图用于显示产品列表
在另一个视图(ShopView)中,我想将数据添加到产品数组
我的产品数组和我的 addProduct() 函数
在 Products.swift 文件中
请帮帮我
谢谢
ContentView.swift
struct ContentView: View {
@ObservedObject var cart = Products()
var body: some View {
NavigationView{
List {
ForEach(cart.products) { product in
Text("\(product.name) \(product.price)$")
}
}
.navigationBarItems(
trailing: NavigationLink(destination: Shop()) {
Text("Go Shop")
})
.navigationBarTitle("Cart")
}
}
}
Product.swift
struct Product: Identifiable {
var id = UUID()
var name: String
var price: Int
}
Shop.swift
struct Shop: View {
@ObservedObject var cart = Products()
var body: some View {
VStack{
Button("Add Product To Cart") {
cart.addProduct(product: Product(name: "Name", price: 399))
}
}
}
}
Products.swift
class Products: ObservableObject {
@Published var products = [Product]()
func addProduct(product: Product) {
products.append(product)
print("Product Added")
}
}
现在,您正在创建 Products
的两个 不同实例 。如果要共享数据,则必须使用同一个实例。
struct ContentView: View {
@ObservedObject var cart = Products()
var body: some View {
NavigationView{
List {
ForEach(cart.products) { product in
Text("\(product.name) \(product.price)$")
}
}
.navigationBarItems(
trailing: NavigationLink(destination: Shop(cart: cart)) { //<-- HERE
Text("Go Shop")
})
.navigationBarTitle("Cart")
}
}
}
struct Shop: View {
@ObservedObject var cart : Products //<-- HERE
var body: some View {
VStack{
Button("Add Product To Cart") {
cart.addProduct(product: Product(name: "Name", price: 399))
}
}
}
}
实现此类功能的另一种方法是使用环境对象。关于该方法的补充阅读:https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-environmentobject-to-share-data-between-views
我认为您会发现最简单的实现方式是将您的模型定义为:
class Products: ObservableObject {
//Implement a shared resource here
public static let shared = Products()
// I would also make the published var name something different then the class name.
// Otherwise you will be calling a lot of products.products.
// Or you could change the name of the class to "Cart"
@Published var products: [Product] = []
func addProduct(product: Product) {
products.append(product)
print("Product Added")
}
}
在您的结构中使用它:
@ObservedObject var cart = Products.shared
这会给你一个共同的共享产品class。您不必担心在视图之间传递。
我想将新数据添加到我项目的列表中 但我做不到
我有一个 ContentView.swift 视图用于显示产品列表 在另一个视图(ShopView)中,我想将数据添加到产品数组 我的产品数组和我的 addProduct() 函数 在 Products.swift 文件中
请帮帮我 谢谢
ContentView.swift
struct ContentView: View {
@ObservedObject var cart = Products()
var body: some View {
NavigationView{
List {
ForEach(cart.products) { product in
Text("\(product.name) \(product.price)$")
}
}
.navigationBarItems(
trailing: NavigationLink(destination: Shop()) {
Text("Go Shop")
})
.navigationBarTitle("Cart")
}
}
}
Product.swift
struct Product: Identifiable {
var id = UUID()
var name: String
var price: Int
}
Shop.swift
struct Shop: View {
@ObservedObject var cart = Products()
var body: some View {
VStack{
Button("Add Product To Cart") {
cart.addProduct(product: Product(name: "Name", price: 399))
}
}
}
}
Products.swift
class Products: ObservableObject {
@Published var products = [Product]()
func addProduct(product: Product) {
products.append(product)
print("Product Added")
}
}
现在,您正在创建 Products
的两个 不同实例 。如果要共享数据,则必须使用同一个实例。
struct ContentView: View {
@ObservedObject var cart = Products()
var body: some View {
NavigationView{
List {
ForEach(cart.products) { product in
Text("\(product.name) \(product.price)$")
}
}
.navigationBarItems(
trailing: NavigationLink(destination: Shop(cart: cart)) { //<-- HERE
Text("Go Shop")
})
.navigationBarTitle("Cart")
}
}
}
struct Shop: View {
@ObservedObject var cart : Products //<-- HERE
var body: some View {
VStack{
Button("Add Product To Cart") {
cart.addProduct(product: Product(name: "Name", price: 399))
}
}
}
}
实现此类功能的另一种方法是使用环境对象。关于该方法的补充阅读:https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-environmentobject-to-share-data-between-views
我认为您会发现最简单的实现方式是将您的模型定义为:
class Products: ObservableObject {
//Implement a shared resource here
public static let shared = Products()
// I would also make the published var name something different then the class name.
// Otherwise you will be calling a lot of products.products.
// Or you could change the name of the class to "Cart"
@Published var products: [Product] = []
func addProduct(product: Product) {
products.append(product)
print("Product Added")
}
}
在您的结构中使用它:
@ObservedObject var cart = Products.shared
这会给你一个共同的共享产品class。您不必担心在视图之间传递。