Swift Core Data - сохранение, заполнение, редактирование атрибута / отношения сущности - PullRequest
0 голосов
/ 20 июня 2020

Я новичок в iOS dev / Core Data, и у меня возникли проблемы с реализацией одной части моего рабочего процесса в моем приложении. См. Ниже:

TableView workflow

Свойства основных данных:

  • item
  • Атрибуты: название, сумма, дата, статус, категория (отн.), Примечание (отн.)

  • примечание

  • Атрибуты: title, contents, createdAt, updatedAt, item (rel)

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

Что я хочу выполнить sh:

  1. Пользователь выбирает строку для отображения сведений об элементе
  2. При просмотре сведений об элементе пользователь выбирает заметки (выделены желтым цветом выше) до go для добавления / редактирования заметок
  3. Примечание - это всего лишь один объект, который пользователь может ввести / обновить нота. Итак, по сути, одна заметка на элемент.

МОЙ КОД

Xcode 11.5, Swift 5

import UIKit
import CoreData

class NoteVC: UIViewController, UITextFieldDelegate, UITextViewDelegate {

//MARK: - Core Data

var item: Item?
var context: NSManagedObjectContext!


//MARK: - Outlets

@IBOutlet weak var headerContainer: UIView!
@IBOutlet weak var headerTitle: UILabel!
@IBOutlet weak var noteView: UIView!
@IBOutlet weak var noteTitleTextField: UITextField!
@IBOutlet weak var noteContentTextView: UITextView!
@IBOutlet weak var noteDataLabel: UILabel!



override func viewDidLoad() {
    super.viewDidLoad()

    setupView()


}

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

    //Update note
    if let title = noteTitleTextField.text, !title.isEmpty {
        item?.notes?.title = title
        item?.notes?.contents = noteContentTextView.text
    }

    item?.notes?.updatedAt = Date()
    item?.notes?.contents = noteContentTextView.text


}
    private func setupView() {

    noteTitleTextField.text = item?.notes?.title
    noteContentTextView.text = item?.notes?.contents
    noteDataLabel.text = DateHelper.convertDate(date: Date())

}

//MARK: - Actions

@IBAction func doneButtonTapped(_ sender: UIButton) {


    item?.notes?.title = noteTitleTextField.text
    item?.notes?.contents = noteContentTextView.text
    item?.notes?.createdAt = Date()
    dismiss(animated: true)



}


}

МОЯ ПРОБЛЕМА

У меня возникла проблема с созданием новой заметки и ее назначением этому элементу и, следовательно, с заполнением сведений о заметке для редактирования. Мне удалось успешно установить атрибуты для item.date, .category на другой контроллер модального представления (так что передача данных работает), но безрезультатно с Notes. Не уверен, из-за отношений или нет. Опять же, я новичок в Core Data, поэтому, пожалуйста, простите меня за то, что это звучит просто.

Любая помощь приветствуется.

Спрашивает друга, = P

adrapp

1 Ответ

0 голосов
/ 20 июня 2020

Похоже, ваша проблема в том, что вы не создаете объект Note до того, как пытаетесь назначить его свойства.

Правильный шаблон для создания заметки и связывания ее с вашим элементом будет примерно таким:

if let note = NSEntityDescription.insertNewObject(forEntityName: "note", into: context) as? Note {

    //set note properties
    note.title = noteTitleTextField.text
    note.contents = noteContentTextView.text
    note.createdAt = Date()

    //set relationship to item
    item.note = note
}

Убедитесь, что имя объекта («примечание») и класс («Примечание») соответствуют тому, что вы определили в своем проекте.

Чтобы разрешить обновление существующей заметки, вы сначала нужно проверить, есть ли заметка. Вы можете изменить приведенный выше код следующим образом:

// get the existing note, if any, or create a new one
let note = item.note ?? NSEntityDescription.insertNewObject(forEntityName: "note", into: context) as? Note

// if note existed or was successfully created...
if let note = note {
    //set note properties
    note.title = noteTitleTextField.text
    note.contents = noteContentTextView.text

    if item.note == nil {
        note.createdAt = Date()
    }
    else {
        note.updatedAt = Date()
    }

    //set relationship to item
    item.note = note
}
...