Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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 核心数据致命错误:在展开可选值时意外发现nil_Ios_Swift_Uitableview_Core Data_Fatal Error - Fatal编程技术网

Ios 核心数据致命错误:在展开可选值时意外发现nil

Ios 核心数据致命错误:在展开可选值时意外发现nil,ios,swift,uitableview,core-data,fatal-error,Ios,Swift,Uitableview,Core Data,Fatal Error,当前出现致命错误:执行此行代码deliveries=employee.delivery?.allObjects as!时,在展开可选值时意外发现nil![NSManagedObject] 我目前正在从另一个tableView发送一名员工,就像这样var employees:[NSManagedObject]和prepareForSegue像这样 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)

当前出现致命错误:执行此行代码
deliveries=employee.delivery?.allObjects as!时,在展开可选值时意外发现nil![NSManagedObject]

我目前正在从另一个
tableView
发送一名员工,就像这样
var employees:[NSManagedObject]
prepareForSegue
像这样

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue == "DelieverySegue"{
        let employeeDeliveries = segue.destinationViewController as! DelieveryTableViewController



        let indexPath = self.tableView.indexPathForSelectedRow



        let selectedEmployee = employees[indexPath!.row] as! Employee

        employeeDeliveries.employee = selectedEmployee





    }
}
我之所以像这样
prepareForSegue
是因为
tableView
中有一个变量
var employee:employee

一旦进入segue,它就会在我的
viewDidLoad()中的
DeliveryTableViewController
中的这一行代码处崩溃

deliveries=employee.delivery?.allObjects as![NSManagedObject]

我的
NSManagedObject
对于这两个对象都是什么样子的

extension雇员{

@NSManaged var first: String?
@NSManaged var last: String?
@NSManaged var phoneNumber: String?
@NSManaged var wage: NSNumber?
@NSManaged var id: NSNumber?
@NSManaged var delievery: NSSet?
}

扩展交付{

@NSManaged var address: String?
@NSManaged var phoneNumber: String?
@NSManaged var subTotal: NSNumber?
@NSManaged var total: NSNumber?
@NSManaged var employee: Employee?
}

这就是我在另一个
viewController
中设置关系的方式,它创建了一个新的交付

@IBAction func saveButton(发送方:AnyObject){

}

我选错了吗?。。我已经在员工和交付之间建立了关系。我当前正在尝试显示我在单击
EmployeeTableViewController
中的特定员工时发送的员工的邮件。有关此信息的任何帮助都将非常有用。谢谢您的时间

我在运行时得到的,在切换到
DeliveryTableViewController


虽然您的问题来源不确定您拥有的代码,但您的编码风格是问题的一部分:

deliveries = employee.delievery?.allObjects as! [NSManagedObject]
这是一种非常不安全的编写Swift代码的方法,当出现问题时,它不会给您任何答案。相反,考虑这样写:

guard let delievery = employee.delivevery else {
  print("Employee: \(employee)")
  fatalError("No deliver object referenced by employee")
}
guard let deliveries = delievery.allObjects as? [NSManagedObject] else {
  fatalError("Unexpected class type in allObjects")
}
var employee: Employee!
guard let emp = employee else {
    fatalError("Employee not assigned")
}
let fetch = NSFetchRequest(entityName: "Delivery")
fetch.predicate = NSPredicate(format: "employee == %@", emp)

let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetch, context: emp.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)

//Finish implementing the NSFetchedResultsController
通过此更改,您可以查看是否没有
delivery
对象,或者对
allObjects
的调用是否存在问题

接下来,为什么要调用AllObject
Employee
Delivery
有关系,称为
Delivery
。这意味着它返回一个
NSSet
。为什么要调用
allObjects
?这将把它变成一个数组,它只是集合的另一种风格

在任何情况下,Swift中的强制向下投射都是不好的,应该避免,除非你绝对毫无疑问地知道每次都会拿回一个物体。在这种情况下,您没有这种保证,应该使用
if let
guard let
来确认您得到了什么


嘿,马库斯,我要上传一张照片,上面是我选择一名员工并转到我的
DeliveryTableViewController

好的,这表明即使是雇员也可以是零,而且出乎意料地是零。我猜您有这样一个实例变量:

guard let delievery = employee.delivevery else {
  print("Employee: \(employee)")
  fatalError("No deliver object referenced by employee")
}
guard let deliveries = delievery.allObjects as? [NSManagedObject] else {
  fatalError("Unexpected class type in allObjects")
}
var employee: Employee!
guard let emp = employee else {
    fatalError("Employee not assigned")
}
let fetch = NSFetchRequest(entityName: "Delivery")
fetch.predicate = NSPredicate(format: "employee == %@", emp)

let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetch, context: emp.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)

//Finish implementing the NSFetchedResultsController
同样,这是Swift的一个坏习惯。您应该将其写为适当的可选项:

var employee: Employee?
然后在需要时将其打开:

guard let empl = employee else {
  fatalError("Employee not set")
}
guard let delievery = empl.delivevery else {
  print("Employee: \(employee)")
  fatalError("No deliver object referenced by employee")
}
deliveries = delievery
现在,您将有一个分配给实例变量的
Delivery
对象的正确展开的集合,您可以从那里显示它们

NSFetchedResultsController
话虽如此,您不应该像这样展示交付内容。您确实应该使用
NSFetchedResultsController
。大概是这样的:

guard let delievery = employee.delivevery else {
  print("Employee: \(employee)")
  fatalError("No deliver object referenced by employee")
}
guard let deliveries = delievery.allObjects as? [NSManagedObject] else {
  fatalError("Unexpected class type in allObjects")
}
var employee: Employee!
guard let emp = employee else {
    fatalError("Employee not assigned")
}
let fetch = NSFetchRequest(entityName: "Delivery")
fetch.predicate = NSPredicate(format: "employee == %@", emp)

let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetch, context: emp.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)

//Finish implementing the NSFetchedResultsController
然后使用
NSFetchedResultsController
UITableView
中显示交付

这是有道理的,如果您查看我的员工表ViewController
prepareforsgue
上面的内容,我会怎么做?这显然是不正确的

同样,我在这里也将使用
NSFetchedResultsController
而不是数组。这就是NSFetchedResultsController的设计目的

但是,如果愿意,您仍然可以使用阵列。我不推荐


这里的错误是,您将
segue
视为
字符串,而不是。您必须从
UIStoryboardSegue
对象中提取
标识符
,然后将其与您期望的标识符进行比较。

虽然您的问题来源不确定于您拥有的代码,但您的编码风格是问题的一部分:

deliveries = employee.delievery?.allObjects as! [NSManagedObject]
这是一种非常不安全的编写Swift代码的方法,当出现问题时,它不会给您任何答案。相反,考虑这样写:

guard let delievery = employee.delivevery else {
  print("Employee: \(employee)")
  fatalError("No deliver object referenced by employee")
}
guard let deliveries = delievery.allObjects as? [NSManagedObject] else {
  fatalError("Unexpected class type in allObjects")
}
var employee: Employee!
guard let emp = employee else {
    fatalError("Employee not assigned")
}
let fetch = NSFetchRequest(entityName: "Delivery")
fetch.predicate = NSPredicate(format: "employee == %@", emp)

let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetch, context: emp.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)

//Finish implementing the NSFetchedResultsController
通过此更改,您可以查看是否没有
delivery
对象,或者对
allObjects
的调用是否存在问题

接下来,为什么要调用AllObject
Employee
Delivery
有关系,称为
Delivery
。这意味着它返回一个
NSSet
。为什么要调用
allObjects
?这将把它变成一个数组,它只是集合的另一种风格

在任何情况下,Swift中的强制向下投射都是不好的,应该避免,除非你绝对毫无疑问地知道每次都会拿回一个物体。在这种情况下,您没有这种保证,应该使用
if let
guard let
来确认您得到了什么


嘿,马库斯,我要上传一张照片,上面是我选择一名员工并转到我的
DeliveryTableViewController

好的,这表明即使是雇员也可以是零,而且出乎意料地是零。我猜您有这样一个实例变量:

guard let delievery = employee.delivevery else {
  print("Employee: \(employee)")
  fatalError("No deliver object referenced by employee")
}
guard let deliveries = delievery.allObjects as? [NSManagedObject] else {
  fatalError("Unexpected class type in allObjects")
}
var employee: Employee!
guard let emp = employee else {
    fatalError("Employee not assigned")
}
let fetch = NSFetchRequest(entityName: "Delivery")
fetch.predicate = NSPredicate(format: "employee == %@", emp)

let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetch, context: emp.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)

//Finish implementing the NSFetchedResultsController
同样,这是Swift的一个坏习惯。您应该将其写为适当的可选项:

var employee: Employee?
然后在需要时将其打开:

guard let empl = employee else {
  fatalError("Employee not set")
}
guard let delievery = empl.delivevery else {
  print("Employee: \(employee)")
  fatalError("No deliver object referenced by employee")
}
deliveries = delievery
现在你将有一个