2016-12-23 4 views
0

Я использую основные данные для сохранения данных для списка задач. Введенные данные сохраняются, но параметр удаления и редактирования не отображается в выбранном TableViewCell.I, но не смог получить достаточный ответ на этот вопрос. Здесь я дал полные коды. Каковы мои ошибки в кодах ... кто-нибудь помог мне?Кнопка удаления и редактирования не отображается в UITableViewCell

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 
    } 
} 
+0

Не перезагружать вид таблицы в 'setEditing'. Фактически вы можете удалить весь метод. – vadian

+0

vadian @ Здравствуйте, сэр, после удаления перезагрузки в setEditing, я могу увидеть опцию удаления в swifting left. Но как только я удалю содержимое ячеек, содержимое будет отображаться снова после запуска проекта. Я думаю, что данные не удаляются из основных данных? Опция «Редактирование» тоже не отображается. Помогите мне, сэр? –

+0

Поскольку вы используете Core Data, вам нужно удалить элемент также из контекста управляемого объекта и сохранить контекст. – vadian

ответ

1
  • Прежде всего удалить весь метод setEditing. Перезагрузка вида таблицы скрывает кнопки редактирования/удаления.

  • Во-вторых, вы должны удалить объект в массиве источников данных, удалить его из контекста управляемого объекта, удалить строку в виде таблицы и сохранить контекст. (Не звоните reloadData() после этого).

    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") 
        } 
        }    
    } 
    
+0

vadian @ U - великий сэр. Большое спасибо !!! И сэр Как мы можем отредактировать содержимое после нажатия на выбранную ячейку ??? –

+0

Это не вопрос. Вам нужно редактируемое текстовое поле (например, путем отображения popover). – vadian

+0

Oooops !!!! ОК сэр!! –

Смежные вопросы