【发布时间】:2017-05-18 22:16:46
【问题描述】:
尝试传递已从 CoreData 调用的数据时,返回的错误显示 Thread 1: EXC_BAD_INSTRUCTION (code=EXC_i386_INVOP, subcode=0x0)。调试器读取
致命错误:在展开可选值时意外发现 nil
但是,当我在将变量分配给文本字段之前添加打印语句时,变量会正确打印出来。我已经迷失了。任何帮助,将不胜感激。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let myVC = storyboard?.instantiateViewController(withIdentifier: "editInventoryItem") as! AddInventoryItemVC
var inventoryItemName: String = ""
var inventoryItemStock: Double = 0.0
var inventoryItemPG: Double = 0.0
var inventoryItemVG: Double = 0.0
let itemName = flavors[indexPath.row]
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Inventory")
request.predicate = NSPredicate(format: "inventoryItemName ==%@", itemName)
if let result = try? context.fetch(request) {
for object in result as! [NSManagedObject] {
inventoryItemName = object.value(forKey: "inventoryItemName") as! String
inventoryItemStock = object.value(forKey: "inventoryItemStock") as! Double
inventoryItemPG = object.value(forKey: "inventoryItemPGPercent") as! Double
inventoryItemVG = object.value(forKey: "inventoryItemVGPercent") as! Double
}
} else {
}
myVC.itemName.text = inventoryItemName
myVC.itemStock.text = "\(inventoryItemStock)"
myVC.itemPG.text = "\(inventoryItemPG)"
myVC.itemVG.text = "\(inventoryItemVG)"
performSegue(withIdentifier: "editInventoryItem", sender: "")
}
编辑: 在应用了 Rinki 的建议后,Xcode 给了我以下更正,并且在运行时仍然返回相同的错误。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let itemName = flavors[indexPath.row]
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Inventory")
request.predicate = NSPredicate(format: "inventoryItemName ==%@", itemName)
if let result = try? context.fetch(request) {
for object in result as! [NSManagedObject] {
inventoryItemName = object.value(forKey: "inventoryItemName") as! String
inventoryItemStock = object.value(forKey: "inventoryItemStock") as! Double
inventoryItemPG = object.value(forKey: "inventoryItemPGPercent") as! Double
inventoryItemVG = object.value(forKey: "inventoryItemVGPercent") as! Double
}
} else {
}
performSegue(withIdentifier: "editInventoryItem", sender: "")
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "editInventoryItem" {
let myVC = segue.destination as! AddInventoryItemVC
myVC.itemName.text = inventoryItemName
myVC.itemStock.text = "\(inventoryItemStock)"
myVC.itemPG.text = "\(inventoryItemPG)"
myVC.itemVG.text = "\(inventoryItemVG)"
}
}
更新:经过一些打印后,现在返回错误的原因是有道理的。 prepareForSegue() 在didSelectRow 之前被调用,因此该值当前为零,但我不知道如何在调用prepareForSegue() 之前调用didSelectRow。
编辑:在做了一些研究并实施了单例之后,我已经解决了这个问题。我在 Singleton 中添加了一个 identifier 变量,在调用 didSelectRow 时将变量更改为 editInventoryItem。在第二个 VC 上,我设置了一个简单的 if 语句,将 identifier 与 editInventoryItem 进行比较并填充相关文本字段。
感谢大家的帮助。一个错误下来,可能是 5,000,000 ! :D
【问题讨论】:
-
您是如何初始化分配数据的变量的?您可能没有对接收属性的强引用,从而丢失了该数据。我知道在深入研究子/父上下文时,需要将子上下文连同数据一起传递和分配给接收类——对子上下文进行弱引用。
-
现在它们在两个单独的函数中使用,我将它们移到类的开头,使它们对两个函数都可用。
-
放置断点并检查您在哪一行收到此错误?
-
Rinki 检查我的更新。该值为 nil,因为在
didSelectRow之前调用了prepare()。不过,我不知道为什么或如何解决它。 -
请原谅我缺乏知识,但我不知道在调用
prepare()函数时用什么替换UIStoryboardSegue。