更改静态变量时更改UILabel

时间:2020-07-17 17:49:52

标签: swift static tableview uilabel stepper

我有一个CartItem结构,用于存储显示在UITableView中的项目。我的UITableView位于CartViewController中。我将custom cell使用table view。这是我的custom cell

class CartItemCell: UITableViewCell {

@IBOutlet weak var productImage: UIImageView!
@IBOutlet weak var productName: UILabel!
@IBOutlet weak var productPrice: UILabel!
@IBOutlet weak var productTotalPrice: UILabel!
@IBOutlet weak var stepper: UIStepper!



override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

var cellIndex: Int?

var product: CartItem?{
    didSet{
    
    // change the cell in table view when first 
    // initialized and when stepper value is changed 
    .
    .
    .
}

@IBAction func stepperValueChanged(_ sender: UIStepper) {
    CartItem.cartItems[self.cellIndex!].number = Int(sender.value)
    self.product?.number = CartItem.cartItems[self.cellIndex!].number
    }
}

CartViewController中,我有totalPrice UILabel,它是从CartItem.totalPrice静态变量中获取其值的。每次单击CartItem.totalPrice中的UIStepper时,都会计算和更改UITableViewCell的值。这是CartViewController

的摘要
class CartViewController: UIViewController{

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var cartLabel: UILabel!
@IBOutlet weak var totalPrice: UILabel!

var items = CartItem.cartItems

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.dataSource = self
    tableView.delegate = self
    tableView.register(UINib(nibName: "CartItemCell", bundle: nil), forCellReuseIdentifier: "ReusableCell")
    self.totalPrice.text = String(Int(CartItem.totalPrice))
    tableView.reloadData()
}
}


extension CartViewController: UITableViewDataSource{

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return items.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ReusableCell", for: indexPath) as! CartItemCell
    
    cell.product = items[indexPath.item]
    cell.cellIndex = indexPath.item
    return cell
}

}



我希望每次更改totalPrice时都要更改CartViewController中的CartItem.totalPrice标签。我在CartItem.totalPrice

中更改了CartItemCell的值

谢谢

1 个答案:

答案 0 :(得分:1)

使用委托或闭包将值从tableviewcell更新到viewController

return ptr[location]

然后在cellforRow中设置委托

Protocol CartItemProtocol: AnyObject{
    func valueUpdated() 
}

class CartItemCell: UITableViewCell {

@IBOutlet weak var productImage: UIImageView!
@IBOutlet weak var productName: UILabel!
@IBOutlet weak var productPrice: UILabel!
@IBOutlet weak var productTotalPrice: UILabel!
@IBOutlet weak var stepper: UIStepper!
weak var delegate: CartItemProtocol?


override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}

var cellIndex: Int?

var product: CartItem?{
    didSet{

    // change the cell in table view when first 
    // initialized and when stepper value is changed 
    .
    .
    .
}

@IBAction func stepperValueChanged(_ sender: UIStepper) {
    CartItem.cartItems[self.cellIndex!].number = Int(sender.value)
    self.product?.number = CartItem.cartItems[self.cellIndex!].number
   self.delegate.valueUpdated()
    }
}

并以委托人身份更新标签

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> 
UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ReusableCell", for: indexPath) as! CartItemCell

    cell.product = items[indexPath.item]
    cell.cellIndex = indexPath.item
    cell.delegate = self
    return cell
}
相关问题