CoreData:第0行没有现有条目,但第1,2,3行没有

时间:2015-04-06 19:22:00

标签: ios swift core-data

我制作了一个CoreData应用程序,其中还包含一个UITableView。该应用程序在启动时将所有CoreData条目加载到UITableViewCells中。我将5个条目保存到CoreData(String类型)中。如果每个UITableViewCell将在cellForRowAtIndexPath填充正确的条目,则indexPath.row: 0处没有条目(零),但在第1,2,3,4和5行存在现有条目。我不知道为什么,但每次加载indexPath.row = 0的单元格加载应用程序崩溃的原因是:fatal error: unexpectedly found nil while unwrapping an Optional valueoptional value是我的核心数据模型的实体的属性。有人知道每次indexPath.row = 0时出现此错误的原因吗?如果您需要更多信息,请随时问我。非常感谢你的帮助。

获取价值:

let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject
var dateFromCell = object.valueForKey("datum") as NSDate?
var dateString = Date.toString(date: dateFromCell!)

保存价值:

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(myDate, forKey: "datum")

// Save the context.
    var error: NSError? = nil
    if !context.save(&error) {
        abort()
    }

3 个答案:

答案 0 :(得分:1)

在尝试诊断细胞之前,先返回并查看您的阵列。显然,数组中的索引0没有值。放置断点并查看数组值。如果使用正确,使用选项将防止崩溃。 (即“??”或类似的东西)。如果没有看到您的实际代码,很难诊断,所以请随时分享问题区域。

答案 1 :(得分:0)

如果问题出在代码的那一部分,那就在这里:

var dateFromCell = object.valueForKey("datum") as NSDate?
var dateString = Date.toString(date: dateFromCell!)
//                                               ^-- Here

dateFromCell是零。当您强行打开它时会导致崩溃。

这可能是因为您在未设置datum的情况下意外将对象保存到Core Data中。只有在数据模型编辑器中将datum属性标记为可选时,才能执行此操作。

但是在开发过程中有时会意外地保存未完成的物体。这就是您的代码必须匹配属性配置的原因。您在代码中视为不可选的可选属性是个坏主意。


您应该在数据模型编辑器中使该属性不可选,因此如果未完全设置对象,则保存将失败。您将在模型编辑器的属性侧栏中找到该设置。

或者您必须在代码中将该属性视为可选属性。

即:

if let dateFromCell = object.valueForKey("datum") as? NSDate {
    var dateString = Date.toString(date: dateFromCell!)

}

答案 2 :(得分:0)

除非您绝对确定它不能为零,否则切勿使用强制解包操作员(感叹号)。

添加force-unwrap相当于添加NSAssert(myVar != nil)。因此,无论何时在某处使用感叹号,您都可以明确地写出断言。至少你会知道你的程序崩溃的确切原因。