Ios 无法将数据传递到我的第二个视图控制器
尝试传递从CoreData调用的数据时,返回的错误显示线程1:EXC_BAD_指令(代码=EXC_i386_INVOP,子代码=0x0)。调试器读取 致命错误:在展开可选值时意外发现nil 但是,当我在将变量分配给文本字段之前添加print语句时,变量会正确打印出来。我已经迷路了。任何帮助都将不胜感激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
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 = ""
}
}
如何初始化分配数据的变量?您可能没有对接收属性的强引用,从而丢失该数据。我知道在深入研究子/父上下文时,会将子上下文连同数据一起传递并分配给接收类