Я пишу приложение, которое сохраняет сущности Movie с использованием Core Data. Кино - это единственная сущность, и есть только один атрибут name: String.
Есть два контроллера вида. Таблица VC в качестве корня навигационной панели и addMovie VC в качестве модального перехода от кнопки «+» на панели навигации.
Описание проблемы:
1) Запустите приложение и извлеките ранее сохраненные фильмы из базы данных, чтобы заполнить табличное представление. Этот шаг работает нормально.
2) Нажмите кнопку «+», чтобы запустить addMovie VC и добавить новый фильм. Этот шаг работает нормально.
3) Добавить фильм, используя textField. Вот где глюк. Введенный фильм отлично записывается в базу данных, но также добавляется запись с нулевой ячейкой «имя».
4) Проблема возникает, только когда приложение переходит из таблицы VC в addMovie VC. Если вы продолжаете добавлять фильмы один раз в addMovieVC, никакие nils не добавляются в базу данных. Если вы вернетесь к таблице VC и снова перейдете к addMovie VC, первый добавленный фильм будет записан отлично, но будет сопровождаться еще одним фильмом с нулевым именем.
Вот мой addMovieVC:
class AddMovieViewController: UIViewController, UITextFieldDelegate
{
var movies: [NSManagedObject] = []
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var button: UIButton!
func textFieldShouldReturn(_ textField: UITextField) -> Bool
{
guard let text = textField.text else
{
textField.resignFirstResponder()
return false
}
let trimmedText = text.trimmingCharacters(in: .whitespaces)
if trimmedText != ""
{
self.save(trimmedText)
textField.text = ""
}
textField.resignFirstResponder()
return true
}
func save(_ name: String)
{
let coreDataStack = CoreDataStack()
coreDataStack.movie.setValue(name, forKeyPath: "name")
do
{
try coreDataStack.context.save()
movies.append(coreDataStack.movie)
} catch
{
print("Save error: \(error)")
}
}
}
И вот как выглядит мой стек основных данных:
struct CoreDataStack
{
let context: NSManagedObjectContext
let entity: NSEntityDescription
let movie: NSManagedObject
let fetchRequest: NSFetchRequest<NSManagedObject>
init()
{
let appDelegate = UIApplication.shared.delegate as! AppDelegate
context = appDelegate.persistentContainer.viewContext
entity = NSEntityDescription.entity(forEntityName: "Movie", in: context)!
movie = NSManagedObject(entity: entity, insertInto: context)
fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Movie")
//let predicate = NSPredicate(format: "name != nil")
//fetchRequest.predicate = predicate
fetchRequest.includesPendingChanges = false
//fetchRequest.returnsObjectsAsFaults = false
}
}
Решения, закомментированные для класса CoreDataStack, не работают.
Любые идеи о том, как избавиться от ноль клеток? Любая помощь будет принята с благодарностью. Спасибо!