Angel Kajol
Angel Kajol

Reputation: 45

Delete and Edit button doesn't appear in UITableViewCell

I am using core data to save data for tasks list. The data entered gets saved but the delete and edit option doesn't appear on the selected TableViewCell.I searched but couldn't get sufficient answer to this question. Here, I have given full codes. What's my mistakes on codes... anyone plzz help me ??

class ToDoTableViewController: UITableViewController {    

  var listItems = [NSManagedObject]()

  override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.add, target: self , action: #selector(ToDoTableViewController.addItem))

    navigationController?.navigationBar.barTintColor = UIColor(red: 220/255, green: 26/255, blue: 104/255, alpha: 1)
    tableView.backgroundView = UIImageView(image: UIImage(named: "settingsscreen.png"))

  }

// for adding items

  func addItem(){

    let alertController = UIAlertController(title: "To Do Tasks Lists!!!!", message: "Write Down...", preferredStyle: .alert)

    let confirmAction = UIAlertAction(title: "Confirm", style: UIAlertActionStyle.default, handler: ({
        (_) in

        if let field = alertController.textFields![0] as? UITextField {

            self.saveItem(itemToSave: (field.text!))
            self.tableView.reloadData()

        }
        }                        
    ))

    // for cancel alert controller

    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil)

    alertController.addTextField(configurationHandler: ({
        (textField) in

        textField.placeholder = "Type in Something!!!!"
    }))

    alertController.addAction(confirmAction)
    alertController.addAction(cancelAction)

    self.present(alertController, animated: true, completion: nil)                
  }

  // to save the data on core data

  func saveItem(itemToSave : String){

    let appDelegate = UIApplication.shared.delegate as! AppDelegate

    let managedContext = appDelegate.managedObjectContext

    let entity = NSEntityDescription.entity(forEntityName: "ListEntity", in: managedContext)

    let item = NSManagedObject(entity: entity!, insertInto: managedContext)

    item.setValue(itemToSave, forKey: "item")

    do {
        try managedContext.save()
        listItems.append(item)
    }
    catch {

        print("Error")
    }                                
  }

  // to show the existing data on core data 

  override func viewWillAppear(_ animated: Bool) {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate

    let managedContext = appDelegate.managedObjectContext

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "ListEntity")

    do{
        let results = try managedContext.fetch(fetchRequest)

        listItems = results as! [NSManagedObject]
    }
    catch {
        print("Error")
    }                
  }

  override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true

  }

  override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        listItems.remove(at: indexPath.row)
        tableView.reloadData()
    }               
  }

  override func setEditing(_ editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)
    tableView.reloadData()
  }

  override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return listItems.count
  }

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

    let item = listItems[indexPath.row]

    cell.textLabel?.text = item.value(forKey: "item") as! String?

    cell.backgroundColor = UIColor.clear
    return cell
  }
}

Upvotes: 0

Views: 296

Answers (1)

vadian
vadian

Reputation: 285072

  • First of all delete the entire method setEditing. Reloading the table view hides the edit/delete buttons.

  • Second of all you have to delete the object in the data source array, remove it from the managed object context, delete the row in the table view and save the context. (Do not call reloadData() after doing that).

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
      if editingStyle == .delete {
         let appDelegate = UIApplication.shared.delegate as! AppDelegate
         let managedContext = appDelegate.managedObjectContext
         let objectToDelete = listItems[indexPath.row]
         listItems.remove(at: indexPath.row)
         managedContext.delete(objectToDelete)
         tableView.deleteRows(at: [indexPath], with: .fade)
         do {
            try managedContext.save()
         }
         catch {
            print("Error")
         }   
      }               
    }
    

Upvotes: 1

Related Questions