我正在编写一个使用Core Data保存电影实体的应用。电影是唯一的实体,并且只有一个属性,名称:字符串。
有两个视图控制器。表VC是导航栏的根,而addMovie VC是通过导航栏上的“ +”按钮进行的模态选择。
问题描述:
1)启动应用程序,并从数据库中获取以前保存的电影,以填充表视图。这样就可以了。
2)点击“ +”按钮,启动addMovie VC并添加新电影。此步骤可以。
3)使用textField添加影片。这就是故障所在。输入的影片完美地写入了数据库,但是还添加了一个带有“ name”单元格为零的记录。
4)仅当应用程序从表VC选择到addMovie VC时,才会发生问题。如果您继续在addMovieVC中添加电影一次,则不会向数据库中添加任何nil。如果您回到表VC,然后再次选择addMovie VC,则添加的第一部电影将被完美录制,但还有另一部名称为nil的电影。
这是我的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类上注释掉的解决方案无效。
关于如何摆脱零细胞的任何想法?任何帮助将不胜感激。谢谢!