我正在尝试将元素添加到数组cart
中。
在不同的项目上多次执行此功能后,我从打印语句中看到,计数从不增加并且始终保持为1。此外,新元素替换了旧元素,而不是追加到数组。
此外,我不知道如何将数据显示到cartTableViewController
的表视图中。每当我导航到cartTableViewController
时,都不会显示任何元素。
@IBAction func addToCart(_ sender: UIBarButtonItem) {
let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
if let cartTableViewController = mainStoryBoard.instantiateViewController(withIdentifier: "CartTableView") as? CartTableViewController {
var cart = cartTableViewController.cartItems
let itemToAdd = CartItem(product: product!, quantity: quantity)
print(itemToAdd!.product.itemName) // the new item replaces the existing one
cart.append(itemToAdd!)
print(cart.count) // count is always 1
print(quantityLabel.text! + " " + (product?.itemName)! + " added")
}
}
答案 0 :(得分:0)
尝试一下可能会对您有所帮助
var cart: [CartItem]!
override func viewDidLoad() {
super.viewDidLoad()
let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
if let cartTableViewController = mainStoryBoard.instantiateViewController(withIdentifier: "CartTableView") as? CartTableViewController {
cart = cartTableViewController.cartItems
}
}
@IBAction func addToCart(_ sender: UIBarButtonItem) {
if cart != nil {
let itemToAdd = CartItem(product: product!, quantity: quantity)
print(itemToAdd!.product.itemName) // the new item replaces the existing one
cart.append(itemToAdd!)
print(cart.count) // count is always 1
print(quantityLabel.text! + " " + (product?.itemName)! + " added")
}
}
答案 1 :(得分:0)
我可以明确地说您对以下行有问题,因为cartTableViewController.cartItems
的值始终为nil
或empty
let cartTableViewController = mainStoryBoard.instantiateViewController(withIdentifier: "CartTableView") as? CartTableViewController
var cart = cartTableViewController.cartItems
每次,您都必须使用old而不是初始化的new对象。 您可以解决定义购物车的全局数组的问题, 在整个应用中均可访问。
代码:
let cartTableViewController = mainStoryBoard.instantiateViewController(withIdentifier: "CartTableView") as? CartTableViewController
var cart = aryCart //Your cart global object
print(cart.count) // Updated Count
更新:
只需在类外部定义一个变量,即可在整个应用程序中自动访问该变量。
var aryCart = [CartItem]()
class CartVC:UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func addToCart(_ sender: UIBarButtonItem) {
let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
if let cartTableViewController = mainStoryBoard.instantiateViewController(withIdentifier: "CartTableView") as? CartTableViewController {
let itemToAdd = CartItem(product: product!, quantity: quantity)
print(itemToAdd!.product.itemName) // the new item replaces the existing one
aryCart.append(itemToAdd!)
print(aryCart.count) // count is always 1
print(quantityLabel.text! + " " + (product?.itemName)! + " added")
}
}
}
答案 2 :(得分:0)
您要创建的新数组仅存在于函数范围内。将cart分配给cartTableViewController.cartItems时,这仅将cartItems中的值复制到cart,而不分配指针。例如:
var cartItems = ["First element"]
var cart = cartItems
cart.append("Second Element")
print(cartItems)
print(cart)
这将打印:
["First element"]
["First element", "Second Element"]
似乎您正在将数据添加到另一个ViewController中的数组。我通常建议您通过其他视图控制器中的实例变量以外的其他机制来更新状态。关于如何以最佳方式构造代码的想法很多,一种适合您的解决方案是使用MVVM模式。本文对此进行了介绍:https://medium.com/@azamsharp/mvvm-in-ios-from-net-perspective-580eb7f4f129
“清理”一点的一种快速方法是使用一个中间对象来存储cartItems数据,您在当前视图控制器和CartTableView中都引用了该对象,例如CartItemStore:
class CartItemStore {
static let shared = CartItemStore()
private let cartItems: [CartItem]
// you can add logic for reading previously added cart items from cache in order to persist it.
// The same goes when adding new cartItems
private init() {
self.cartItems = []
}
func getItem(_ index: Int) -> CartItem? {
//Check whether the index passed in is valid
if cartItems.indices.contains(index) {
return cartItems[index]
} else {
return nil
}
}
func addItem(_ item: CartItem) {
cartItems.append(item)
}
func numberOfItems() -> Int {
return cartItems.count
}
}
然后,您可以通过以下方式使用单例存储:
// This inside the current view controller
private let cartItemStore = CartItemStore.shared
@IBAction func addToCart(_ sender: UIBarButtonItem) {
...
let itemToAdd = CartItem(product: product!, quantity: quantity)
cartItemStore.addItem(itemToAdd)
print(cartItemStore.numberOfItems())
}
然后,您也可以通过访问单例来从其他视图控制器读取项目。
通常应避免使用字母,因为可能很难测试您的应用程序。单身人士允许在任何地方更新状态,如果您滥用状态足够好,就会造成噩梦。我在这里使用它为您提供了一种快速完成一些不太耦合的方法的方法,但是如果您在这段代码库中坐了一段时间,则可能需要重新考虑一下。随意研究MVVM以及如何使用它来管理状态,从长远来看,这将使事情变得更容易,从而有一种结构化的方式来管理应用程序中的状态:)希望这对您有所帮助。