iOS开发UITableView中如何删除某一组中某一行的数据?要用啥方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发UITableView中如何删除某一组中某一行的数据?要用啥方法?相关的知识,希望对你有一定的参考价值。

你是要怎么个删除法。是要实现滑动cell出现删除按钮,然后点击删除? 还是什么。。

//按钮显示的内容
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath

return @"删除";


//这里就是点击删除执行的方法
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath


1.如果你的数据是从服务器获取的,那就直接调用接口,重新获取数据源 再
[tableView reloadData]; 就行

2.如果只想修改本地数据
[_data removeObjectAtIndex:[indexPath row]]; //删除_data数组里的数据
[tableview deleteRowsAtIndexPaths:[NSMutableArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; //删除对应数据的cell
参考技术A 行数、cell,didSelectCellAtIndexPath,所有一切都围绕dataSource 的array
array中删掉一个元素,reload 一下,自然所有的东西都更新了,

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

【中文标题】如何在 Swift / iOS 中从 UITableView 中删除行并从 UserDefaults 中更新数组【英文标题】:How to delete rows from UITableView and update array from UserDefaults in Swift / iOS 【发布时间】:2021-09-16 09:12:45 【问题描述】:

我已经通过this 从 UITableView 中删除行并从 UserDefaults 更新数组。但它没有用。

这是我从 tableview 中删除行的代码。但它没有存储在 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()
        
    

【问题讨论】:

您是否阅读了我在链接问题中的回答?顺便删除…reloadData()。这是多余的。 是的。我阅读并实施。但是没有用。请建议我如何解决 请显示什么不起作用。我已经编辑了答案并将代码更新为 Swift 5。 是的,完全做到了这一点,并且出现类似错误(无论何时单击删除):“libc++abi.dylib:以 NSException 类型的未捕获异常终止 *** 由于未捕获异常“NSInvalidArgumentException”而终止应用程序,原因:'尝试为键 myArrayKey 插入非属性列表对象(“...”)'以 NSException 类型的未捕获异常终止” 您正在尝试对非属性列表对象进行操作。检查我的答案。 【参考方案1】:

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

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

    根据“[CartStruct]”从 UserDefaults 解析您的购物车数据

    检查并删除它。

    删除后更新为 UserDefaults

    重新加载您的 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( $0.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
      

【讨论】:

以上是关于iOS开发UITableView中如何删除某一组中某一行的数据?要用啥方法?的主要内容,如果未能解决你的问题,请参考以下文章

李洪强iOS开发之 - 指定刷新tableview的某一组

对于这种边缘情况,如何检测何时从 iOS 的 uitableview 中删除单元格?

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

从一组中找出产生最少浪费的数字

[IOS开发教程] iOS如何固定UITableView中cell.imageView.image的图片大小

如何查找组中另一组的计数