Как удалить строку из UITableView swift 4, в которой данные хранятся с использованием CoreData? - PullRequest
0 голосов
/ 23 февраля 2019

Я новичок, пытающийся изучить основные понятия iOS и swift.Итак, я делаю демонстрационное приложение, в котором я храню имена людей, использующих UITableView.Чтобы сделать хранилище приложения постоянным, я использовал основные данные только с одной сущностью с именем «Person» с единственным атрибутом «name», который является строковым значением.Чтобы повысить уровень этого приложения, мне нужно добавить функцию удаления.Как мы видим во многих приложениях для iOS, функция удаления при смахивании влево, я хочу реализовать те же функции в этом приложении.Я посмотрел на различные решения, но не могу понять, как мне удастся удалить строку и обновить таблицу в основных данных одновременно.Я застрял в этой проблеме с нескольких часов, пытаясь удалить строку в UITableView с помощью жеста пальцем.Любая помощь будет оценена.

Ниже мой код:

ViewController.swift

import UIKit
import CoreData

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    var people: [NSManagedObject] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        title = "The List"
        tableView.register(UITableViewCell.self,
                           forCellReuseIdentifier: "Cell")
    }

    // Implement the addName IBAction
    @IBAction func addName(_ sender: UIBarButtonItem) {
        let alert = UIAlertController(title: "New Name", message: "Add a new name", preferredStyle: .alert)
        let saveAction = UIAlertAction (title: "Save", style: .default) {
            [unowned self] action in
            guard let textField = alert.textFields?.first, let nameToSave = textField.text else {
                return
            }
            self.save(name: nameToSave)
            self.tableView.reloadData()
        }
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel)
        alert.addTextField()

        alert.addAction(saveAction)
        alert.addAction(cancelAction)

        present(alert, animated: true)
    }

    // MARK: - SAVING TO CORE DATA

    // CoreData kicks in here!
    func save(name: String) {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return
        }
        // 1
        let managedContext = appDelegate.persistentContainer.viewContext

        // 2
        let entity = NSEntityDescription.entity(forEntityName: "Person", in: managedContext)!
        let person = NSManagedObject(entity: entity, insertInto: managedContext)

        // 3
        person.setValue(name, forKeyPath: "name")

        // 4
        do {
            try managedContext.save()
            people.append(person)
        } catch let error as NSError {
            print("Could not save. \(error), \(error.userInfo)")
        }
    }

    // MARK: - FETCHING FROM CORE DATA

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        // 1
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return
        }

        let managedContext = appDelegate.persistentContainer.viewContext

        // 2
        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Person")

        // 3
        do {
            people = try
                managedContext.fetch(fetchRequest)
        } catch let error as NSError {
            print("Could not save. \(error), \(error.userInfo)")
        }
    }
}
// MARK: - UITableViewDataSource

extension ViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return people.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let person = people[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = person.value(forKeyPath: "name") as? String
        return cell
    }
}

// MARK: - UITableViewDelegate

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if (editingStyle == .delete) {
            // handle delete (by removing the data from your array and updating the tableview)

        }
    }
}

Экран приложения:

enter image description here

Модель данных:

enter image description here

1 Ответ

0 голосов
/ 23 февраля 2019

Необходимо удалить управляемый объект, вызвав delete (_ :) в контексте управляемого объекта, например:

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
    return
}
let managedContext = appDelegate.persistentContainer.viewContext
let person = people[indexPath.row]
managedContext.delete(person)

И чтобы зафиксировать изменение, вызовите save () в контексте управляемого объекта:

try? managedContext.save()

Затем не забудьте также обновить кэш лиц в вашем контроллере представления:

people.remove(at: indexPath.row)

И, наконец, удалить строку в табличном представлении:

tableView.deleteRows(at: [indexPath], with: .automatic)

Это должно выполнить то, что вы хотите.

Отсутствующая реализация может быть:

 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {

        // delete the person in core data
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return
        }
        let managedContext = appDelegate.persistentContainer.viewContext
        let person = people[indexPath.row]
        managedContext.delete(person)
        try? managedContext.save()

        // remove the person from cache
        people.remove(at: indexPath.row)

        // delete row from table view
        tableView.deleteRows(at: [indexPath], with: .automatic)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...