首页 > 解决方案 > 快速弹出视图控制器时导航栏中的购物车计数未更新

问题描述

我已经创建了带有购物车的自定义导航栏及其计数,如下所示:如果我调用setUpNavigationBar()所有视图控制器,我将获得带有购物车和计数的导航栏

func setUpNavigationBar(){

self.navigationController?.navigationBar.backgroundColor = CommonColor.navigationColor
self.navigationController?.navigationBar.barTintColor = CommonColor.navigationColor
self.navigationController?.navigationBar.isTranslucent = false
self.navigationController?.navigationBar.layer.masksToBounds = false

let cartBtn: BadgeButton = BadgeButton(type: .custom)
cartBtn.setImage(#imageLiteral(resourceName: "icon55"), for: .normal)
cartBtn.addAction(for: .touchUpInside) {
print("in cart")
let signupVC = (StoryBoard.driver).instantiateViewController(identifier: "ShoppingCartVC") as! ShoppingCartVC
self.navigationController?.pushViewController(signupVC, animated: true)
}
cartBtn.frame = CGRect(x: 0, y: 0, width: 20, height: 20)
let cartQty = UserDefaults.standard.value(forKey: "cartCount")
cartBtn.badgeText = cartQty as? String
let btnCart = UIBarButtonItem(customView: cartBtn)

self.navigationItem.setRightBarButton(btnCart, animated: true)

}

func setBadgeCountForCart(with : String?){
let badge = self.navigationItem.rightBarButtonItems?.map({$0.customView}).filter({$0 is BadgeButton}).first as? BadgeButton
badge?.badgeText = with
}

但是在 ShoppingCartVC我不想要导航栏时,我没有调用setUpNavigationBarShoppingCartVC viewdidload

因此,如果从购物车中删除产品并单击后退按钮,ShoppingCartVC则 cartConut 不会在弹出的视图控制器中更新

删除产品后,我更新了 cartCount,如下所示:

class ShoppingCartVC: UIViewController {

 override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    self.navigationController?.navigationBar.isHidden = true
    self.serviceCall()
}
func serviceCall(){
 self.cartDB = ShoppingCartDetaModel(dictionary: responseData.dict as NSDictionary? ?? NSDictionary())
            
            UserDefaults.standard.set(self.cartDB?.result?.cart?.total_item, forKey: "cartCount")
            self.setUpNavigationBar()

}

@IBAction func back(_ sender: UIButton){
    self.navigationController?.navigationBar.isHidden = false
    self.serviceCall()
    UserDefaults.standard.set(self.cartDB?.result?.cart?.total_item, forKey: "cartCount")
    self.setUpNavigationBar()
    self.navigationController?.popViewController(animated: true)
}

}

我应该在哪里改变,请帮忙

标签: swiftcountuinavigationbarpopviewcontroller

解决方案


导航回来后,您需要使用更新的数量更新BadgeButton其属性。text您可以使用不同的方法来实现这一目标。最简单且不太干净的方法是调用self.setUpNavigationBar()viewWillAppear方法。一种更简洁的方法是使用NotificationCenterclass 或 aPublisher并在每次数量变化时发布更新。

ViewWillAppear:https ://developer.apple.com/documentation/uikit/uiviewcontroller/1621510-viewwillappear

通知中心:https ://developer.apple.com/documentation/foundation/notificationcenter

发布者:https ://developer.apple.com/documentation/combine/publisher


推荐阅读