如何从 UITableView 中删除行并从 Swift / iOS 中的 UserDefaults 更新数组

How to delete rows from UITableView and update array from UserDefaults in Swift / iOS

我已经完成 从 UITableView 中删除行并从 UserDefaults 更新数组。但是没用。

这是我从表视图中删除行的代码。但它没有存储在 userdefaults

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            cartArray.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)
            tableView.reloadData()
        }
    }

请建议我如何解决这个问题。提前致谢!

更新:

这是我的(电子商务应用程序的)cartViewController 的完整代码:

import UIKit

class CartViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    var arrdata = [jsonstruct]()
    var categorydata = [Categories]()
    var imgdata = [Images]()
    
    var cartArray = [CartStruct]()
    
    @IBOutlet var cartTableView: UITableView!
    
    @IBOutlet var totalCount: UILabel!
    @IBOutlet var subtotalPrice: UILabel!
    @IBOutlet var shippingPrice: UILabel!
    @IBOutlet var totalPrice: UILabel!
    @IBOutlet var proceedBtn: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.getCartData()
        
        let userDefaults = UserDefaults.standard
        guard let data = userDefaults.array(forKey: "myArrayKey") as? [CartStruct] else {
            return
        }
        cartArray = data
        cartTableView.reloadData()
    }
    
    func getCartData() {
           let defaults = UserDefaults.standard
           if let data = defaults.data(forKey: "cartt") {
               cartArray = try! PropertyListDecoder().decode([CartStruct].self, from: data)
               cartTableView.reloadData()
           }
       }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return cartArray.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "CartCellTableViewCell", for: indexPath) as! CartCellTableViewCell
 
        cell.cartImageView.downloadImage(from: cartArray[indexPath.row].cartItems.images.first?.src ?? "place_holder_image")

        cell.productNameCart.text = cartArray[indexPath.row].cartItems.name
        cell.prodductDescCart.text = cartArray[indexPath.row].cartItems.categories.first?.type
        cell.productPriceCart.text = cartArray[indexPath.row].cartItems.price
        
        cell.addBtn.addTarget(self, action: #selector(add(sender:)), for: .touchUpInside)
        cell.addBtn.tag = indexPath.row
        
        let cartQuantity = cartArray[indexPath.row].cartQuantity
        cell.prodCount.text = "\(cartQuantity)"
        
        if cartQuantity >= 0 {
            cell.subBtn.isUserInteractionEnabled = true;
            cell.subBtn.addTarget(self, action: #selector(sub(sender:)), for: .touchUpInside)
            cell.subBtn.tag = indexPath.row
        } else {
            cell.subBtn.isUserInteractionEnabled = false;
        }
        return cell
    }
    
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            cartArray.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .automatic)
            let userDefaults = UserDefaults.standard
            userDefaults.set(cartArray, forKey: "myArrayKey")
        }
    }
    
    @objc func add(sender: UIButton){
        if cartArray[sender.tag].cartQuantity >= 0 {
            cartArray[sender.tag].cartQuantity += 1
            cartTableView.reloadData()
        }
    }
    
    @objc func sub(sender: UIButton){
        if cartArray[sender.tag].cartQuantity > 0 {
            cartArray[sender.tag].cartQuantity -= 1
            cartTableView.reloadData()
        }
    }
}

您正在尝试对非属性 列表对象进行操作。

您必须遵循以下提到的步骤:

  1. 根据“[CartStruct]”

    从 UserDefaults 解析您的购物车数据
  2. 检查并删除。

  3. 删除后更新为UserDefaults

  4. 重新加载您的 TableView

     func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
         if editingStyle == .delete {
             cartArray = self.updateCartItems(name: cartArray[indexPath.row].cartItems.name)
             tableView.deleteRows(at: [indexPath], with: .fade)
         }
     }
    

这里,您需要勾选并删除:

   func updateCartItems(name: String) -> [CartStruct] {
        guard var cartItems = self.getCartData() else { return [] }
        cartItems = cartItems.filter({ [=11=].cartItems.name != name })
        if let updatedCart = try? PropertyListEncoder().encode(cartItems) {
            UserDefaults.standard.set(updatedCart, forKey: "cartt")
        }
        UserDefaults.standard.set(cartItems.count, forKey: "CountAddedProducts")
        return cartItems
      }