当尝试传递从 CoreData 调用的数据时,返回的错误显示线程 1:EXC_BAD_INSTRUCTION(代码=EXC_i386_INVOP,子代码=0x0)。调试器读取
fatal error: unexpectedly found nil while unwrapping an Optional value
但是,当我在将变量分配给文本字段之前添加打印语句时,变量会正确打印出来。我迷路了。任何帮助,将不胜感激。
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
之前被调用,所以当前值为 nil,但我不知道如何在 之前调用
被调用。 didSelectRow
>prepareForSegue()
编辑:在做了一些研究并实现了单例后,我解决了这个问题。我在 Singleton 中添加了一个 identifier
变量,在调用 didSelectRow 时将该变量更改为 editInventoryItem
。在第二个 VC 上,我设置了一个简单的 if 语句,将 identifier
与 editInventoryItem
进行比较并填充有问题的文本字段。
感谢大家的帮助。一个错误下来,大概要 5,000,000 去! :D
最佳答案
您的问题与核心数据无关,而是您对 segues 的使用。 performSegue 方法是从 Storyboard 中创建一个新的 viewController。从 instantiateViewController
创建的 myVC
在函数结束时被丢弃。而是使用 prepareForSegue:sender:
将值添加到 viewController。
关于ios - 无法将数据传递到我的第二个 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44039391/