我制作了一个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 value
。 optional 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()
}
答案 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)
。因此,无论何时在某处使用感叹号,您都可以明确地写出断言。至少你会知道你的程序崩溃的确切原因。