ios - 无法将数据传递到我的第二个 View Controller

标签 ios swift core-data segue

当尝试传递从 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 语句,将 identifiereditInventoryItem 进行比较并填充有问题的文本字段。

感谢大家的帮助。一个错误下来,大概要 5,000,000 去! :D

最佳答案

您的问题与核心数据无关,而是您对 segues 的使用。 performSegue 方法是从 Storyboard 中创建一个新的 viewController。从 instantiateViewController 创建的 myVC 在函数结束时被丢弃。而是使用 prepareForSegue:sender: 将值添加到 viewController。

关于ios - 无法将数据传递到我的第二个 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44039391/

相关文章:

ios - 新的 Apple Vision API VNTranslationalImageRegistrationRequest

arrays - 在 Swift3 中对数组进行排序

ios - 在validateForInsert中执行获取请求过于昂贵

ios - Rubymotion x Facebook iOS SDK//安装问题//[!] 无法找到 `Facebook-iOS-SDK` 的规范

ios - PFQuery 只返回 100

ios - 查找由 UIStackView swift 调整的 View 的大小

ios - 二进制文件因为符号链接(symbolic link)无效而被拒绝,有什么想法吗?

ios - Swift - Switch 语句不起作用

iphone - 使用内存中持久存储作为临时区域是否可能/明智,如果可以,我该如何清除它?

iOS - 核心数据 - NSManagedObjectContext - 不确定是否保存