- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当前出现 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
最佳答案
虽然您的问题根源未由您拥有的代码决定,但您的编码风格是问题的一部分:
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? Employee
与 Delivery
有关系,称为 delievery
。这意味着它返回一个 NSSet
。为什么要调用 allObjects
?这只是将它变成一个数组,这只是集合的另一种风格。
在任何情况下,Swift 中的强制向下转型都是不好的,应该避免,除非你绝对毫无疑问地知道你每次都会得到一个对象。在这种情况下,您没有这种保证,应该使用 if let
或 guard 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/
func initializePickerViewProperties() { let font = UIFont (name: "SanFranciscoDisplay-Regular",
我试图将预先附加的字符串作为 URL 请求传递,但我不断收到错误消息: fatal error :在展开可选值时意外发现 nil 此错误指向行:let searchTerm = "http://goo
我有一个像这样的html结构 旁边的两个 div 确实有类和子元素,但为了这个问题,您不需要知道它们是什么。在 DOM 准备就绪后,我将两个内部 div 包裹在一个新的 div 中,就
显然是我的语法错误。 我有大量的 div,其中少量的内容包含在 anchor 中。我要做的是移除 anchor 。 感谢您的帮助! http://jsfiddle.net/danielredwood/
关闭。这个问题是 opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 已关闭 2 年前。 奥 git _
我已经包装了阶段,我想使用“wrap”函数来打开它们。但是,在这种情况下,由于我不清楚的原因,我无法获得展开的相位。 包裹的阶段是 通过观察横截面,我可以看到相被包裹 我已将图像从 0 缩放到 2*p
用 jQuery 包装 div 后,展开它们然后尝试再次包装它们似乎会丢失 float 属性(我的猜测),我不知道如何解决这个问题。 当第一次按下 JSFiddle 中的换行按钮时,它会像我期望的那样
我将容器 .vorteile 通过 jQuery 包装在 .vorteile_outer 中。当我想在 .vorteile 上使用 .unwrap() 删除 .vorteile_outer 时,.vo
这个问题已经有答案了: jQuery : remove element except inside element (4 个回答) 已关闭 9 年前。 jquery中有一个很棒的方法叫做wrap()它
这个问题已经有答案了: jQuery : remove element except inside element (4 个回答) 已关闭 9 年前。 我有一段 HTML 代码: table 我如何从
当用户提交或聚焦无效输入时,我有一个包含在错误 div 中的文本字段。如果用户纠正了错误,我想删除包装器,但是,unwrap() 方法会导致字段失去焦点。 $(special_input).live(
我正在寻找一种方法来“解开”已发布到 MVC 核心服务的 JSON。比方说,我有以下方法: [HttpPost] public dynamic SayHello(string First
我引用了以下网页: https://serverfault.com/questions/153983/sockets-found-by-lsof-but-not-by-netstat 使用Python
我有一个 jQuery 突出显示工具,它可以动态地将一个类添加到一个字符串中。如果一个元素包含单词 Hello World 并且用户搜索'ell',它为单词添加了一个跨度 Hello world 要重
如何在 Iframe 中展开 span 标签。 Directional 我尝试使用此删除 $('iframe').contents().find(".newtext").unwrap(); 如果 re
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 4 年前。 Improve
在我的代码中,我有很多带有 Option 的结构在他们里面。我需要在很多地方与他们一起工作,所以我的代码中充斥着像 car.engine.as_ref().unwrap() 这样的结构访问。 .这对代
这个问题在这里已经有了答案: Unable to read file contents to string - Result does not implement any method in sco
出于某种原因,Rust 编译器提示 Result 没有实现 unwrap,即使我提供的错误类型确实实现了 Debug。下面提供了出错的代码。 use std::fmt::{Display, Debug
多么奇怪的错误: use std::collections::BTreeMap; struct MyStruct1; struct Error; fn get_res() -> Result), Er
我是一名优秀的程序员,十分优秀!