CoreData:第 0 行没有现有条目,但第 1、2、3 行没有现有条目
Posted
技术标签:
【中文标题】CoreData:第 0 行没有现有条目,但第 1、2、3 行没有现有条目【英文标题】:CoreData: No existing entry for row 0 but for row 1,2,3 【发布时间】:2015-04-06 19:22:00 【问题描述】:我制作了一个 CoreData 应用程序,其中还包含一个 UITableView。该应用程序在启动时将所有 CoreData 条目加载到 UITableViewCells 中。我将 5 个条目保存到 CoreData(字符串类型)中。如果每个 UITableViewCell 都将在cellForRowAtIndexPath
处填充正确的条目,则indexPath.row: 0
处没有条目(nil),但在第 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
处,您正在存储一个可选值。如果一个可选项包含一个 nil 值并且你解开它,你的程序将会崩溃。因此出现错误消息unexpectedly found nil while unwrapping an Optional value
。在使用可选值之前,使用if let
语法检查可选的内容。
【参考方案1】:
在尝试诊断细胞之前先返回并查看您的阵列。显然,数组中的索引 0 处没有值。放置一个断点并查看您的数组值。如果使用得当,使用可选项将防止崩溃。 (即。??“”或类似的东西)。没有看到您的实际代码就很难诊断,因此请随时分享问题区域。
【讨论】:
我用一些代码更新了这个问题。谢谢你帮助我!【参考方案2】:如果问题出在代码的那部分,就在这里:
var dateFromCell = object.valueForKey("datum") as NSDate?
var dateString = Date.toString(date: dateFromCell!)
// ^-- Here
dateFromCell
为零。当你强行打开它时会导致崩溃。
这可能是因为您不小心将对象保存到 Core Data 中而没有设置 datum
。只有在数据模型编辑器中将datum
属性标记为可选时,这才有可能。
但在开发过程中有时会意外保存未完成的对象。这就是为什么您的代码必须匹配属性配置的原因。您在代码中视为非可选的可选属性是个坏主意。
您应该在数据模型编辑器中将该属性设为非可选,因此如果对象未完全设置,则保存将失败。您将在模型编辑器的属性侧栏中找到该设置。
或者您也必须在代码中将该属性视为可选属性。
即:
if let dateFromCell = object.valueForKey("datum") as? NSDate
var dateString = Date.toString(date: dateFromCell!)
【讨论】:
【参考方案3】:除非您绝对确定它不能为 nil,否则切勿使用 force-unwrap 运算符(感叹号)。
添加强制解包等同于添加NSAssert(myVar != nil)
。所以每当你在某处使用感叹号时,你不妨明确地写下断言。至少你会确切地知道你的程序为什么会崩溃。
【讨论】:
以上是关于CoreData:第 0 行没有现有条目,但第 1、2、3 行没有现有条目的主要内容,如果未能解决你的问题,请参考以下文章
当我将条目插入现有部分时,为啥我的 UITableView 会为我添加另一个部分?
MFC SetDlgItemText(IDC_EDIT,_T("1")),接下来怎么在第二行显示2,但第一行还是1,不要告诉我那种笨法子!