В настоящее время у меня есть приложение, которое отображает текст и изображения в контроллере TableView , где он считывает основные данные.
Мое приложение выполняет следующие действия (шаг за шагом):
Нажата кнопка, чтобы открыть библиотеку фотографий
Выбирает изображение из библиотеки фотографий
Как толькопосле выбора фотографии появляется UIAlert с двумя текстовыми полями, в которые вводится текст, а также с двумя кнопками Отмена и Сохранить .
Вводится текст, который сохраняется в базе данных, а также изображение.
Все отлично работает, отправляется и хорошо отображается в TableViewCell с изображением и текстами, но изображение уже отправляется еще до объявления managedObjectContext.save()
Я заметил, что это проблема, потому что, когда я выбираю фотографию из средства выбора фотографий, но нажимаю Отмена при появлении запроса на ввод текста в текстеполя, изображение отправляется в базу данных, даже если не нажать кнопку Сохранить в UIView , которая содержит только объявление managedObjectContext.save()
.
Я загрузилвидео-демонстрация на YouTube для более подробного объяснения этой проблемы: https://www.youtube.com/watch?v=E6aBOwkgwsM
Вот несколько моих идей для решения этой проблемы, но я не знаю с чего начать:
Помощь в структурировании кода, вызывающего эту проблему
При нажатии Отмена удалите последнюю запись в Базовых данных, так как изображение передается только взапись а не тексты.
Примечание. В настоящее время каждый атрибут отмечен как необязательный.
Код ниже:
func create (with image:UIImage){
let object = Entity(context: managedObjectContext)
object.image = NSData(data: image.jpegData(compressionQuality: 0.3)!) as Data
let inputAlert = UIAlertController(title: "Title", message: "Enter texts", preferredStyle: .alert)
inputAlert.addTextField { (textfield:UITextField) in
textfield.placeholder = "Textfield 1"
}
inputAlert.addTextField { (textfield:UITextField) in
textfield.placeholder = "Textfield 2"
}
let save = UIAlertAction (title: "Save", style: .default, handler: { (action:UIAlertAction) in
let firstTextField = inputAlert.textFields?.first
let secondTextField = inputAlert.textFields?.last
if firstTextField?.text != "" && secondTextField?.text != "" {
object.firstAttribute = firstTextField?.text
object.secondAttribute = secondTextField?.text
do{
try self.managedObjectContext.save()
self.loadData()
}
catch{
let alert = UIAlertController(title: "Cannot Save", message: "Error saving", preferredStyle: UIAlertController.Style.alert)
let okAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.cancel) {
UIAlertAction in
alert.removeFromParent()
}
alert.addAction(okAction)
self.present(alert, animated: true, completion: nil)
print("Could not save data \(error.localizedDescription)")
}
}
})
let cancel = UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel) {
UIAlertAction in
self.loadData()
}
inputAlert.addAction(save)
inputAlert.addAction(cancel)
if self.presentedViewController == nil {
self.present(inputAlert, animated: true, completion: nil)
}
else {
self.dismiss(animated: false, completion: nil)
self.present(inputAlert, animated: true, completion: nil)
}
}