Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法将数据传递到我的第二个视图控制器_Ios_Swift_Core Data_Segue - Fatal编程技术网

Ios 无法将数据传递到我的第二个视图控制器

Ios 无法将数据传递到我的第二个视图控制器,ios,swift,core-data,segue,Ios,Swift,Core Data,Segue,尝试传递从CoreData调用的数据时,返回的错误显示线程1:EXC_BAD_指令(代码=EXC_i386_INVOP,子代码=0x0)。调试器读取 致命错误:在展开可选值时意外发现nil 但是,当我在将变量分配给文本字段之前添加print语句时,变量会正确打印出来。我已经迷路了。任何帮助都将不胜感激 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let

尝试传递从CoreData调用的数据时,返回的错误显示线程1:EXC_BAD_指令(代码=EXC_i386_INVOP,子代码=0x0)。调试器读取

致命错误:在展开可选值时意外发现nil

但是,当我在将变量分配给文本字段之前添加print语句时,变量会正确打印出来。我已经迷路了。任何帮助都将不胜感激

    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: "")
      }
func tableView(tableView:UITableView,didSelectRowAt indexPath:indexPath){
将myVC=storyboard?.InstanceEviewController(标识符为:“editInventoryItem”)设置为!AddInventoryItemVC
var inventoryItemName:String=“”
var inventoryItemStock:Double=0.0
var inventoryItemPG:Double=0.0
var inventoryItemVG:Double=0.0
让itemName=flavors[indexPath.row]
让appDelegate=UIApplication.shared.delegate为!appDelegate
让上下文=appDelegate.persistentContainer.viewContext
let request=NSFetchRequest(entityName:“库存”)
request.predicate=NSPredicate(格式:“inventoryItemName==%@”,itemName)
如果let result=try?context.fetch(请求){
对于结果中的对象![NSManagedObject]{
inventoryItemName=object.value(forKey:“inventoryItemName”)为!字符串
inventoryItemStock=object.value(forKey:“inventoryItemStock”)为!Double
inventoryItemPG=object.value(forKey:“inventoryItemPGPercent”)为!Double
inventoryItemVG=object.value(forKey:“inventoryItemVGPercent”)为!Double
}
}否则{
}
myVC.itemName.text=inventoryItemName
myVC.itemStock.text=“\(inventoryItemStock)”
myVC.itemPG.text=“\(inventoryItemPG)”
myVC.itemVG.text=“\(inventoryItemVG)”
性能检查(标识符为:“editInventoryItem”,发件人为:“”)
}
编辑: 在应用了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)"
    }
}
func tableView(tableView:UITableView,didSelectRowAt indexPath:indexPath){
让itemName=flavors[indexPath.row]
让appDelegate=UIApplication.shared.delegate为!appDelegate
让上下文=appDelegate.persistentContainer.viewContext
let request=NSFetchRequest(entityName:“库存”)
request.predicate=NSPredicate(格式:“inventoryItemName==%@”,itemName)
如果let result=try?context.fetch(请求){
对于结果中的对象![NSManagedObject]{
inventoryItemName=object.value(forKey:“inventoryItemName”)为!字符串
inventoryItemStock=object.value(forKey:“inventoryItemStock”)为!Double
inventoryItemPG=object.value(forKey:“inventoryItemPGPercent”)为!Double
inventoryItemVG=object.value(forKey:“inventoryItemVGPercent”)为!Double
}
}否则{
}
性能检查(标识符为:“editInventoryItem”,发件人为:“”)
}
覆盖功能准备(对于segue:UIStoryboardSegue,发送方:有吗?){
如果segue.identifier==“editInventoryItem”{
将myVC=segue.destination设为!AddInventoryItemVC
myVC.itemName.text=inventoryItemName
myVC.itemStock.text=“\(inventoryItemStock)”
myVC.itemPG.text=“\(inventoryItemPG)”
myVC.itemVG.text=“\(inventoryItemVG)”
}
}
更新:经过一些打印后,现在可以理解为什么会返回错误
prepareForSegue()
在调用
didSelectRow
之前被调用,因此当前值为零,但我不知道如何在调用
prepareForSegue()
之前调用
didSelectRow

编辑:在做了一些研究并实现了一个单例之后,我已经解决了这个问题。我在Singleton中添加了一个
标识符
变量,在调用didSelectRow时将该变量更改为
editInventoryItem
。在第二个VC中,我设置了一个简单的if语句,将
identifier
editInventoryItem
进行比较,并填充相关的文本字段


谢谢大家的帮助。一个错误,可能还有5000000个错误D

您的问题与核心数据无关,而是您对segues的使用。performsgue方法是从故事板创建一个新的viewController<在函数结束时,将丢弃从
instantialeviewcontroller
创建的code>myVC。改为使用
prepareforsgue:sender:
将值添加到viewController。

prepareforsgue()方法将在调用performsgue:

performSegue(withIdentifier: "editInventoryItem", sender: nil)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {


    if(segue.identifier == "editInventoryItem") {
        let myVC = segue.destinationViewController as! NextViewController
        myVC.itemName.text = inventoryItemName
      myVC.itemStock.text = "\(inventoryItemStock)"
      myVC.itemPG.text = "\(inventoryItemPG)"
      myVC.itemVG.text = "\(inventoryItemVG)"
    }
}
在这里,您可以将数据从SourceViewController发送到目标View Controller

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {


    if(segue.identifier == "editInventoryItem") {
        let myVC = segue.destinationViewController as! NextViewController
        myVC.itemName.text = inventoryItemName
      myVC.itemStock.text = "\(inventoryItemStock)"
      myVC.itemPG.text = "\(inventoryItemPG)"
      myVC.itemVG.text = "\(inventoryItemVG)"
    }
}

也许您可以尝试使用
单例共享实例

创建NSObject类型的新Swift文件

YourAppState.swift

    class YourAppState : NSObject {
        class var sharedInstance: YourAppState {
          struct Static {
            static var onceToken: dispatch_once_t = 0
            static var instance: YourAppState? = nil
          }

          dispatch_once(&Static.onceToken) {
            Static.instance = YourAppState()
          }

         return Static.instance!

        }
    }
使用此功能,您可以执行以下操作:

在共享实例文件中创建一个新变量

var inventoryItemName=”“

在去下一个VC或表演segue之前, 将值赋给
inventoryItemName=object.value(forKey:“inventoryItemName”)为!字符串
。在目标VC类中,像这样传递值

self.itemName.text=YourAppState.sharedInstance().inventoryItemName

只需确保在执行segue之前添加值即可


希望有帮助,干杯

在第一个ViewController上,我的代码如下:

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] {
            Singleton.sharedInstance.itemName = object.value(forKey: "inventoryItemName") as! String
            Singleton.sharedInstance.itemStock = object.value(forKey: "inventoryItemStock") as! Double
            Singleton.sharedInstance.itemPG = object.value(forKey: "inventoryItemPGPercent") as! Double
            Singleton.sharedInstance.itemVG = object.value(forKey: "inventoryItemVGPercent") as! Double
        }
    } else {

    }
    Singleton.sharedInstance.identifier = "editInventoryItem"
}
override func viewDidAppear(_ animated: Bool) {
    print(Singleton.sharedInstance.identifier)
    print(Singleton.sharedInstance.itemName)

    if Singleton.sharedInstance.identifier == "editInventoryItem" {
        nicotineSwitch.isEnabled = false
        VGSwitch.isEnabled = false
        PGSwitch.isEnabled = false

        itemName.text = Singleton.sharedInstance.itemName
        itemStock.text = "\(Singleton.sharedInstance.itemStock)"
        itemPG.text = "\(Singleton.sharedInstance.itemPG)"
        itemVG.text = "\(Singleton.sharedInstance.itemVG)"
        Singleton.sharedInstance.identifier = ""
    }
}

在第一个ViewController上,我的实现代码如下:

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] {
            Singleton.sharedInstance.itemName = object.value(forKey: "inventoryItemName") as! String
            Singleton.sharedInstance.itemStock = object.value(forKey: "inventoryItemStock") as! Double
            Singleton.sharedInstance.itemPG = object.value(forKey: "inventoryItemPGPercent") as! Double
            Singleton.sharedInstance.itemVG = object.value(forKey: "inventoryItemVGPercent") as! Double
        }
    } else {

    }
    Singleton.sharedInstance.identifier = "editInventoryItem"
}
override func viewDidAppear(_ animated: Bool) {
    print(Singleton.sharedInstance.identifier)
    print(Singleton.sharedInstance.itemName)

    if Singleton.sharedInstance.identifier == "editInventoryItem" {
        nicotineSwitch.isEnabled = false
        VGSwitch.isEnabled = false
        PGSwitch.isEnabled = false

        itemName.text = Singleton.sharedInstance.itemName
        itemStock.text = "\(Singleton.sharedInstance.itemStock)"
        itemPG.text = "\(Singleton.sharedInstance.itemPG)"
        itemVG.text = "\(Singleton.sharedInstance.itemVG)"
        Singleton.sharedInstance.identifier = ""
    }
}

如何初始化分配数据的变量?您可能没有对接收属性的强引用,从而丢失该数据。我知道在深入研究子/父上下文时,会将子上下文连同数据一起传递并分配给接收类