简体   繁体   中英

Deleting a UITableView cell in a specific section

There is a task. Each cell contains a button by clicking which you want to delete this cell. The problem is that sections are used to delineate the entire list by category. The data I take from Realm DB. removal must occur under two conditions because the name is repeated, so you need to consider the name from the label and the name of the section. I will be very grateful for the sample code with comments.

import UIKit
import RealmSwift

class PurchesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var purchesTableView: UITableView!
    let manage = ManagerData()

    override func viewDidLoad() {
        super.viewDidLoad()
        purchesTableView.delegate = self
        purchesTableView.dataSource = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        purchesTableView.reloadData()
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return manage.loadPurchases().0.count
    }

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return manage.loadPurchases().0[section]
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return manage.loadPurchases().1[section].count
    }

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

        cell.productLabel.text = manage.loadPurchases().1[indexPath.section][indexPath.row]
        cell.weightProductLabel.text = manage.loadPurchases().2[indexPath.section][indexPath.row]
        cell.weightNameLabel.text = manage.loadPurchases().3[indexPath.section][indexPath.row]

//        cell.boughtButton.addTarget(self, action: #selector(removeProduct), for: .touchUpInside)

        return cell
    }
}

class CustomPurchesTableViewCell: UITableViewCell {
    @IBOutlet weak var boughtButton: UIButton!
    @IBOutlet weak var productLabel: UILabel!
    @IBOutlet weak var weightProductLabel: UILabel!
    @IBOutlet weak var weightNameLabel: UILabel!

    @IBAction func removePurches(_ sender: Any) {
        print("remove")
    }
}

method for get data

func loadPurchases() -> ([String], Array<Array<String>>, Array<Array<String>>, Array<Array<String>>) {
        var sections: [String] = []
        var product = Array<Array<String>>()
        var weight = Array<Array<String>>()
        var nameWeight = Array<Array<String>>()

        let realm = try! Realm()
        let data = realm.objects(Purches.self)
        for item in data {
            if sections.contains(item.nameDish) == false {
                sections.append(item.nameDish)
            }
        }

        for a in sections {
            var productArr = Array<String>()
            var weightArr = Array<String>()
            var nameWeightArr = Array<String>()
            for prod in data {
                if a == prod.nameDish {
                    productArr.append(prod.product)
                    weightArr.append(prod.weight)
                    nameWeightArr.append(prod.nameWeigh)
                }
            }
            product.append(productArr)
            weight.append(weightArr)
            nameWeight.append(nameWeightArr)
        }
        return (sections, product, weight, nameWeight)
    }

Index path you will get in cell class Index path have two property section and row for table view

Now you can create on more method in Controller class and assign to a variable to every cell or you can use editAction provided by table view for delete

in order to get number section and row you need create IBOutlet in custom cell and on ViewController class is created addTarget for your button. Example code at the bottom.

import UIKit
import RealmSwift

class PurchesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var purchesTableView: UITableView!
let manage = ManagerData()

          //... more code ...

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

        cell.productLabel.text = manage.loadPurchases().1[indexPath.section][indexPath.row]
        cell.weightProductLabel.text = manage.loadPurchases().2[indexPath.section][indexPath.row]
        cell.weightNameLabel.text = manage.loadPurchases().3[indexPath.section][indexPath.row]

        cell.boughtButton.addTarget(self, action: #selector(removePurches(_:)), for: .touchUpInside)

        return cell

    }

    @objc func removePurches(_ sender: UIButton) {
        let position: CGPoint = sender.convert(CGPoint.zero, to: purchesTableView)
        let indexPath: IndexPath! = self.purchesTableView.indexPathForRow(at: position)
        print("indexPath.row is = \(indexPath.row) && indexPath.section is = \(indexPath.section)")
        purchesTableView.deleteRows(at: [indexPath], with: .fade)
    }
}

and custom class CustomPurchesTableViewCell for cell

class CustomPurchesTableViewCell: UITableViewCell {
    @IBOutlet weak var boughtButton: UIButton! // you button for press
    @IBOutlet weak var productLabel: UILabel!
    @IBOutlet weak var weightProductLabel: UILabel!
    @IBOutlet weak var weightNameLabel: UILabel!
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM