【发布时间】:2015-07-10 09:58:06
【问题描述】:
我制作了一个使用核心数据的应用。我制作了一个函数,可以保存 1 或 2 个值/将数据写入核心数据。这是以下方法:
func saveName(name: String) {
let myDate:NSDate = NSDate()
let context = self.fetchedResultsController.managedObjectContext
let entity = self.fetchedResultsController.fetchRequest.entity!
let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName(entity.name!, inManagedObjectContext: context) as NSManagedObject
if markCell == true {
newManagedObject.setValue(name, forKey: "markedCell")
markCell = false
}
else {
newManagedObject.setValue(name, forKey: "name")
newManagedObject.setValue(myDate, forKey: "datum")
}
// Save the context.
var error: NSError? = nil
if !context.save(&error) {
abort()
}
}
如果markCell == true 会在函数cellForRowAtIndexPath 中发生崩溃。如果markCell == false(进入else)一切正常。
如果我运行这个函数:
func saveName(name: String) {
let myDate:NSDate = NSDate()
let context = self.fetchedResultsController.managedObjectContext
let entity = self.fetchedResultsController.fetchRequest.entity!
let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName(entity.name!, inManagedObjectContext: context) as NSManagedObject
newManagedObject.setValue(name, forKey: "markedCell")
markCell = false
newManagedObject.setValue(name, forKey: "name")
newManagedObject.setValue(myDate, forKey: "datum")
// Save the context.
var error: NSError? = nil
if !context.save(&error) {
abort()
}
}
没有发生崩溃,但我还向markedCell 添加了一个值。如果 bool 设置为 true,我只想在 markedCell 中添加一个值(用户按下按钮 -> bool 将设置为 true 并且将调用 func saveName)。
从核心数据加载数据(创建 UITableViewCell):
//Get task
let context = self.fetchedResultsController.managedObjectContext
let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject
var taskString:NSString
taskString = object.valueForKey("name") as String
cell.textLabel!.text = object.valueForKey("name") as? String
//Set accessory type
var request:NSFetchRequest = NSFetchRequest(entityName: "Person")
request.predicate = NSPredicate(format:"markedCell = %@", taskString)
var results : [NSManagedObject] = context.executeFetchRequest(request, error: nil) as [NSManagedObject]
if (results.count > 0) {
//Element exists
cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
println("Cell is marked")
}
else {
//Doesn't exist
cell.accessoryType = UITableViewCellAccessoryType.None
println("Cell isn't marked")
}
【问题讨论】:
-
请提供您在崩溃时收到的确切消息
-
name为零。但是保存功能正确吗? -
稍后我会在家里检查。您确定在调用函数时传递的名称变量有值吗?
-
你能提供整个项目(或所有相关部分)吗?
-
当您的 if 语句为真并且您需要设置它时,您是否没有设置“基准”?此外,我认为将 NSManagedObject 子类化是一种很好的做法,请查看以下链接:code.tutsplus.com/tutorials/…(在 obj-C 中)或andrewcbancroft.com/2014/07/17/…