Как редактировать текст, сохраненный в CoreData? - PullRequest
0 голосов
/ 13 мая 2019

Я добавил CoreData в приложение Notes.Он сохраняет данные, удаляет их и т. Д. Теперь я застрял в редактировании уже существующих заметок.

Ну, я пытался удалить предыдущий элемент и сохранить новый, но я теперь, как это сделать в tableView, где вы можете просто "notes.remove (at: indexPath.row)", и я понятия не имею,как это сделать в другом vieController.Кроме того, я пытался удалить объект с «фильтрованным», но он не работал ни

Эта функция загружает заметки из CoreData:

    func getNotes(with request: NSFetchRequest<Note> = Note.fetchRequest()) {

         do {
             notes = try Constants.context.fetch(request)
         } catch {
             print("Loading error \(error)")
         }
           tableView.reloadData()
    }

Эта сохраняет его:

func saveNote() {
            do {
                try Constants.context.save()
            } catch {
                print(error.localizedDescription)
            }
        }

И я пытался добавить функцию редактирования:

    func editNote() {

         let editedNote = Note(context: Constants.context)
         editedNote.text = noteDetailOutlet.text
         dataManager.saveNote()
         navigationController?.popViewController(animated: true)
         callback?()
    }

Вот где я выполняю переход к vc, который вносит изменения:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let vc = storyboard?.instantiateViewController(withIdentifier: "NoteDetailsViewController") as! NoteDetailsViewController
    let note = notes[indexPath.row]
    vc.passedNote = note.text ?? "Empty note"
    vc.callback = { [weak self] in
        if Constants.context.hasChanges {
            self?.notes.remove(at: indexPath.row)
        }
        self?.getNotes()
    }

Constants.context.hasChangesне работает, как я думал, это будет

1 Ответ

0 голосов
/ 13 мая 2019

Основные объекты данных находятся в графе памяти, поэтому, когда вы редактируете какое-то свойство объекта и сохраняете контекст, объект редактируется.

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

при подписке на контекст вы сохраните уведомление

NotificationCenter.default.addObserver(self, selector: #selector(managedObjectContextWillSave), name: Notification.Name.NSManagedObjectContextWillSave, object: Constants.context)

и вот как работает ваша уведомленная функция

@objc
func managedObjectContextWillSave(notification: NSNotification) {
    for object in (notification.object as! NSManagedObjectContext).updatedObjects {
        if let note = object as? Note {
            //Do Something like loading table cell again
        }
    }

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