Проведите пальцем, чтобы удалить функцию вставки, включая основные данные - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь создать приложение «Простой список имен». Я посмотрел это видео и скопировал все (https://www.youtube.com/watch?v=tP4OGvIRUC4). Теперь я хочу добавить функцию «Размах» для удаления. Это работает так, как я хочу, чтобы оно работало, но когда я закрою и снова открою приложение, оно будет таким же, как раньше. Я пробовал разные вещи, но это не сработало.

У кого-нибудь есть идеи?

Привет из Швейцарии

Вот мой ViewController:

import UIKit
import CoreData

class ViewController: UIViewController {

@IBOutlet weak var tableView: UITableView!

    var people = [Person]()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        let fetchRequest: NSFetchRequest<Person> = Person.fetchRequest()

        do {
          let people = try PersistenceServce.context.fetch(fetchRequest)
            self.people = people
            self.tableView.reloadData()
        }catch{}
    }

    @IBAction func onPlusTapped() {
        let alert = UIAlertController(title: "Add name", message: nil, preferredStyle: .alert)
        alert.addTextField { (textField) in
            textField.placeholder = "Name"

        }
        let action = UIAlertAction(title: "Add", style: .default) { (_) in
            let name = alert.textFields!.first!.text!
            let person = Person(context: PersistenceServce.context)
            person.name = name
            PersistenceServce.saveContext()
            self.people.append(person)
            self.tableView.reloadData()

        }
        alert.addAction(action)
        present(alert, animated: true, completion: nil)
    }
}

extension ViewController: UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int {
         return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return people.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .subtitle, reuseIdentifier: nil)
        cell.textLabel?.text = people[indexPath.row].name
        return cell
    }
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

        guard editingStyle == UITableViewCell.EditingStyle.delete else { return }
        people.remove(at: indexPath.row)

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

Ответы [ 5 ]

0 голосов
/ 28 января 2020

Для того, чтобы что-то делать с основными данными, ему нужно загрузить все необходимые объекты в память, к которой будет обращаться ваш контекст, как только вы загрузите элемент, который хотите удалить, в контекст, все, что вам нужно сделать, это просто context.delete (item) tableViewArray.remove (at: itemIndex в массиве) Затем вызовите context.save () для сохранения изменений, которые вы внесли в хранилище постоянных данных

0 голосов
/ 28 января 2020

Прежде всего, никогда не вызывайте reloadData() сразу после insertRows(at или deleteRows(at, потому что методы вставки / удаления обновляют пользовательский интерфейс.

Чтобы сделать удаление постоянным, необходимо удалить элемент в контекст и сохранить контекст.

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

    guard editingStyle == .delete else { return }
    let personToDelete = people.remove(at: indexPath.row)
    PersistenceServce.context.delete(personToDelete)
    tableView.deleteRows(at: [indexPath], with: .automatic)
    PersistenceServce.saveContext()
}
0 голосов
/ 28 января 2020

при перезагрузке приложений ваша таблица снова получает данные из выборки, где хранятся удаленные данные. если вам нравится удалять данные в извлечении, посмотрите эту тему Базовый объект удаления данных

0 голосов
/ 28 января 2020

Вот как я это делал ранее.

override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
        // deleteAction, Call the deleteobject function, and then reload the data
        let deleteAction  = UITableViewRowAction(style: .default, title: DELETE_TITLE) { (rowAction, indexPath) in
            _ = deleteObject(name: self.dataSource[indexPath.row].name)
            self.tableview.reload()
        }
     return [deleteAction]
}


func deleteObject(name: String) -> Bool {
        let context = getContext()
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: ENTITY_NAME)
        fetchRequest.predicate = NSPredicate(format: formatStringForPredicate(oldListName: name))
        let objects = try! context.fetch(fetchRequest)
        for obj in objects {
            context.delete(obj as! NSManagedObject)
        }
        do {
            try context.save()
            return true
        } catch {
            return false
        }
    }

Обратите внимание, что вам может потребоваться изменить функцию deleteObject.

0 голосов
/ 28 января 2020

Вы просто удаляете элемент из локального массива, вам необходимо сохранить изменения после его удаления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...