gpt4 book ai didi

ios - 核心数据 fatal error : unexpectedly found nil while unwrapping an Optional value

转载 作者:搜寻专家 更新时间:2023-11-01 06:19:30 24 4
gpt4 key购买 nike

当前出现 fatal error :在执行这行代码 deliveries = employee.delievery?.allObjects as 时解包可选值时意外发现 nil! [NS管理对象]

我目前正在从另一个 tableView dispatch 一名员工,像这样 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.delievery?.allObjects 作为! [NSManagedObject]

我的 NSManagedObject 两者看起来像什么。

分机员工{

@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(sender: AnyObject) {

    let description = NSEntityDescription.entityForName("Employee", inManagedObjectContext: manageObjectContext)


let employee = Employee(entity: (description)!, insertIntoManagedObjectContext: manageObjectContext)
employee.first = first.text
employee.last = last.text
employee.phoneNumber = phoneNumber.text
employee.wage = Float(wage.text!)
employee.id = Int(employeeId.text!)


do{
try
manageObjectContext.save()
first.text = ""
last.text = ""
phoneNumber.text = ""
wage.text = ""
employeeId.text = ""
status.text = "Success!"



}catch let error as NSError{

status.text = error.localizedFailureReason
}

}

我是不是投错了?..我已经在 Employee 和 Delivery 之间建立了关系。我目前正在尝试显示我在 EmployeeTableViewController 中单击特定员工时发送的员工的交付情况,任何有关这方面的帮助都将非常有帮助,谢谢您的宝贵时间。

我在运行时得到的结果,在转至 DeliveryTableViewController

后失败

What i get after segueing to 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")
}

通过此更改,您可以查看您是否没有 delievery 对象,或者您对 allObjects 的调用是否存在问题。

继续这个,为什么要调用 allObjects? EmployeeDelivery 有关系,称为 delievery。这意味着它返回一个 NSSet。为什么要调用 allObjects?这只是将它变成一个数组,这只是集合的另一种风格。

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

hey Marcus I'm gonna up load a picture of what happens when i select an employee and segue over to my DeliveryTableViewController

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

var employee: Employee!

同样,这在 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 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 中显示交付。

makes sense so how would i do so if you look above in my EmployeeTableViewController prepareForSegue thats obviously not correct.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
guard let identifier = segue.identifier else {
fatalError("Segue without an identifier")
}
switch identifier {
case "DelieverySegue":
guard let employeeDeliveries = segue.destinationViewController as? DelieveryTableViewController else {
fatalError("Unexpected view controller class")
}
guard let indexPath = self.tableView.indexPathForSelectedRow else {
fatalError("No row selected")
}
let employee = fetchedResultsController.objectAtIndexPath(indexPath)
//Use a NSFetchedResultsController here also
//let selectedEmployee = employees[indexPath!.row] as! Employee
employeeDeliveries.employee = employee
default: break
}
}

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

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

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

关于ios - 核心数据 fatal error : unexpectedly found nil while unwrapping an Optional value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36848022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com