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
的调用是否存在问题
接下来,为什么要调用AllObjectEmployee
与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
中显示交付
这是有道理的,如果您查看我的员工表ViewControllerprepareforsgue
上面的内容,我会怎么做?这显然是不正确的
同样,我在这里也将使用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
的调用是否存在问题
接下来,为什么要调用AllObjectEmployee
与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
现在你将有一个