添加超过 5 个相关对象时核心数据应用程序崩溃
core data app crash when adding more than 5 related objects
我有两个核心数据实体,每个实体都与另一个存在一对多关系。我正在使用 tableView
来允许用户 select 哪些 wageClasses 与给定的提案相关。该项目是 Swift 3,iOS 10.2.1,我正在使用编辑器菜单中的 NSManagedObject
子类。
这一切都很好,直到我尝试将第六个 wageClass 添加到提案中。 注意:如果我尝试将前 5 个以外的任何值添加到 WageClass 数组中,它就会崩溃。但是当我打印数组时,它会打印与数组中一样多的值。 应用程序崩溃并出现错误:在展开可选值时意外发现 nil。
我也遇到了线程 1:EXC_BREAKPOINT 错误,但是断点导航器和 lldb 没有列出任何断点。
我已经通过尝试单独添加 wageClasses,通过以不同的顺序添加它们,以及通过创建最多十个 wageClasses 来测试这个(看看最后创建的 wageClass 是否没有加载到 tableView
) 但运气不好,我得到了相同的结果。
这是我要添加的地方:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "AddWageClassCell", for: indexPath)
let wageClass = wageClasses[indexPath.row]
let wageClassStatus = wageClass.value(forKey: "checked") as? Bool ?? true
cell.textLabel?.text = wageClass.value(forKey: "wageClassName") as? String
var accessoryType = UITableViewCellAccessoryType.none
var tintColor = UIColor.clear
if (wageClassStatus) {
accessoryType = UITableViewCellAccessoryType.checkmark
tintColor = UIColor.green
}
cell.accessoryType=accessoryType
cell.tintColor = tintColor
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
let wageClassObject = self.wageClasses[indexPath.row]
var wageClassStatus = wageClassObject.value(forKey: "checked") as? Bool ?? false
wageClassObject.setValue(!wageClassStatus, forKey:"checked")
proposalToEdit?.addToWageClasses(wageClassObject)
do {
try
ad.saveContext()
} catch let error as NSError {
print("Cannot save object: \(error), \(error.localizedDescription)")
}
tableView.deselectRow(at: indexPath,animated:false)
tableView.reloadRows(at: [indexPath], with: .none)
}
感谢您的评论!
我终于意识到,当我在一个单独的 xib 上的一个单独的 tableView 上用 wageClasses
格式化一个单元格时,我是在强制展开一个变量。当我将其包装在 if let 语句中时
if let cell = tableView.cellForRow(at: indexPath) as? WageCell {
configureCell(cell: cell, indexPath: indexPath as NSIndexPath)
} else {
print("something is nil")
}
}
崩溃消失了。
我有两个核心数据实体,每个实体都与另一个存在一对多关系。我正在使用 tableView
来允许用户 select 哪些 wageClasses 与给定的提案相关。该项目是 Swift 3,iOS 10.2.1,我正在使用编辑器菜单中的 NSManagedObject
子类。
这一切都很好,直到我尝试将第六个 wageClass 添加到提案中。 注意:如果我尝试将前 5 个以外的任何值添加到 WageClass 数组中,它就会崩溃。但是当我打印数组时,它会打印与数组中一样多的值。 应用程序崩溃并出现错误:在展开可选值时意外发现 nil。
我也遇到了线程 1:EXC_BREAKPOINT 错误,但是断点导航器和 lldb 没有列出任何断点。
我已经通过尝试单独添加 wageClasses,通过以不同的顺序添加它们,以及通过创建最多十个 wageClasses 来测试这个(看看最后创建的 wageClass 是否没有加载到 tableView
) 但运气不好,我得到了相同的结果。
这是我要添加的地方:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "AddWageClassCell", for: indexPath)
let wageClass = wageClasses[indexPath.row]
let wageClassStatus = wageClass.value(forKey: "checked") as? Bool ?? true
cell.textLabel?.text = wageClass.value(forKey: "wageClassName") as? String
var accessoryType = UITableViewCellAccessoryType.none
var tintColor = UIColor.clear
if (wageClassStatus) {
accessoryType = UITableViewCellAccessoryType.checkmark
tintColor = UIColor.green
}
cell.accessoryType=accessoryType
cell.tintColor = tintColor
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
let wageClassObject = self.wageClasses[indexPath.row]
var wageClassStatus = wageClassObject.value(forKey: "checked") as? Bool ?? false
wageClassObject.setValue(!wageClassStatus, forKey:"checked")
proposalToEdit?.addToWageClasses(wageClassObject)
do {
try
ad.saveContext()
} catch let error as NSError {
print("Cannot save object: \(error), \(error.localizedDescription)")
}
tableView.deselectRow(at: indexPath,animated:false)
tableView.reloadRows(at: [indexPath], with: .none)
}
感谢您的评论!
我终于意识到,当我在一个单独的 xib 上的一个单独的 tableView 上用 wageClasses
格式化一个单元格时,我是在强制展开一个变量。当我将其包装在 if let 语句中时
if let cell = tableView.cellForRow(at: indexPath) as? WageCell {
configureCell(cell: cell, indexPath: indexPath as NSIndexPath)
} else {
print("something is nil")
}
}
崩溃消失了。