Ios 从另一个类中的按钮重新加载UITableView(Swift)

Ios 从另一个类中的按钮重新加载UITableView(Swift),ios,swift,uitableview,Ios,Swift,Uitableview,我有一个应用程序,试图在多选项卡应用程序中实现“添加到购物车”功能。我有一个用于我的购物车页面的选项卡和一个用于我的购物车页面的选项卡,我已经将我的购物车页面设置为一个表视图,其中每个单元格都指向一个带有产品信息的视图控制器,在该控制器中,您可以单击“添加到购物车”按钮,将产品添加到稍后在我的购物车页面的表视图中显示的数组中 我遇到的问题是,一旦我导航到购物车页面并尝试将项目添加到购物车中,数组会发生变化(通过打印进行测试),但tableView不会重新加载,也看不到正在添加的项目。如果我只是去

我有一个应用程序,试图在多选项卡应用程序中实现“添加到购物车”功能。我有一个用于我的购物车页面的选项卡和一个用于我的购物车页面的选项卡,我已经将我的购物车页面设置为一个表视图,其中每个单元格都指向一个带有产品信息的视图控制器,在该控制器中,您可以单击“添加到购物车”按钮,将产品添加到稍后在我的购物车页面的表视图中显示的数组中

我遇到的问题是,一旦我导航到购物车页面并尝试将项目添加到购物车中,数组会发生变化(通过打印进行测试),但tableView不会重新加载,也看不到正在添加的项目。如果我只是去商店页面,然后添加项目,然后打开购物车,所有的项目都会加载,但我不能再添加了

当我单击“添加到购物车”按钮(在另一个类和另一个视图中)时,它会刷新(在另一个类中)tableView并进行更新,即使在我的tableView最初已加载之后,我该如何做到这一点

下面是我的按钮代码(注释点显示我希望某种函数重新加载表的位置):

这是我的购物车页面的viewController:

import UIKit
var cartArray =  [Cart(name: "initial", thumbnails: "sgA1.jpg", price: "initial", quantity: 0)]
class CartViewController: UIViewController{

@IBOutlet var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.dataSource = self
    tableView.reloadData()

    // Do any additional setup after loading the view.
}}

extension CartViewController: UITableViewDataSource{
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if(cartArray[0].name.isEqual("initial")){
            return 0
        }
        else{
        return cartArray.count
        }
    }

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as? CartViewCell {
            cell.configurateTheCell(cartArray[indexPath.row])
            return cell
        }
        tableView.reloadData()
        return UITableViewCell()
        
    }
}

我希望在通过单击另一个类中的按钮来更新数组之后,能够在这里重新加载tableView。如何操作?

您可以在每次更新您的
cartArray
时重新加载表视图

只需执行以下操作

var cartArray =  [Cart(name: "initial", thumbnails: "sgA1.jpg", price: "initial", quantity: 0)] {
    didSet { 
       NotificationCenter
           .default
           .post(Notification(name: "cartArrayUpdated"))
    }
}
deinit {
    NotificationCenter.default.removeObserver(self)
}
然后将您的
CartViewController
添加为该通知的观察者

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.dataSource = self
    tableView.reloadData()
    NotificationCenter
       .default
       .addObserver(self, 
                    selector: #selector(refresh), 
                    name: .init("cartArrayUpdated"), 
                    object: nil)
    // Do any additional setup after loading the view.
}
然后在
CartViewController
中创建处理tableview刷新的函数

@objc func refresh() {
    tableView.reloadData()
}
另外,当不再需要时,不要忘记删除作为观察者的
CartViewController
。在
viewDidLoad
之后添加以下内容

var cartArray =  [Cart(name: "initial", thumbnails: "sgA1.jpg", price: "initial", quantity: 0)] {
    didSet { 
       NotificationCenter
           .default
           .post(Notification(name: "cartArrayUpdated"))
    }
}
deinit {
    NotificationCenter.default.removeObserver(self)
}
我也同意@Leo Dabus将这个数组声明为全局变量是一种不好的做法。您应该在
CartViewController
中包含此功能,然后只需

var cartArray =  [Cart(name: "initial", thumbnails: "sgA1.jpg", price: "initial", quantity: 0)] {
    didSet { 
       tableView.reloadData()
    }
}

我在类外部创建cartArray是为了在其他类中访问它,所以它说tableView是一个未解析的标识符。我该如何解决这个问题?我也尝试过使用协议,但不确定如何使用它。如果你能给我一些代码来实现它,那就太好了。不要将数组声明为全局变量。将其作为视图控制器的属性。如果需要在另一个控制器中更改其值,可以使另一个控制器成为tableview控制器的委托。您还可以将控制器实例对象传递给另一个视图控制器,并更新数组属性和/或重新加载tableview。