Ios 状态恢复和托管对象崩溃
我自己一直找不到任何对这个话题有帮助的信息,我有点新,自学成才,所以对任何无知表示歉意。我正在制作一个联系人风格的应用程序,允许您记录与特定人员的访问。我使用核心数据来存储数据,并且有一个一对多的关系,将个人实体链接到访问实体 当我通过选择一个特定的人从主联系人列表中分离出来时,我将该nsmanagedobject of person传递给新的视图控制器,并在获取我对此人进行的访问时将其用作谓词 问题产生于此时的国家恢复。我希望能够返回到此人的页面(以及整个应用程序中的一些其他实例,但这一示例涵盖了问题),但由于我通过segue传递person对象,该对象现在为零,这会导致我的应用程序崩溃两次,然后启动到主屏幕,显示清除和恢复数据 无论我尝试在encoderestorablestate中存储什么:使用,按home,然后在xcode中停止应用程序,然后在xcode中重新启动,decoderestorablestate函数永远不会被调用,并且在此之前person为零时崩溃 下面是我的fetchedresultscontroller,崩溃发生在谓词行self.person为nilIos 状态恢复和托管对象崩溃,ios,swift,core-data,state-restoration,Ios,Swift,Core Data,State Restoration,我自己一直找不到任何对这个话题有帮助的信息,我有点新,自学成才,所以对任何无知表示歉意。我正在制作一个联系人风格的应用程序,允许您记录与特定人员的访问。我使用核心数据来存储数据,并且有一个一对多的关系,将个人实体链接到访问实体 当我通过选择一个特定的人从主联系人列表中分离出来时,我将该nsmanagedobject of person传递给新的视图控制器,并在获取我对此人进行的访问时将其用作谓词 问题产生于此时的国家恢复。我希望能够返回到此人的页面(以及整个应用程序中的一些其他实例,但这一示例涵
lazy var fetchedResultsController: NSFetchedResultsController<Visit> = {
// Initialize Fetch Request
let fetchRequest: NSFetchRequest<NSManagedObject> = NSFetchRequest(entityName: "Visit")
// Add Sort Descriptors
let predicate = NSPredicate(format: "person == %@", self.person!)
fetchRequest.predicate = predicate
let sortDescriptor = NSSortDescriptor(key: "date", ascending: false)
fetchRequest.sortDescriptors = [sortDescriptor]
// Initialize Fetched Results Controller
let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
// Configure Fetched Results Controller
fetchedResultsController.delegate = self
return fetchedResultsController as! NSFetchedResultsController<Visit>
}()
惰性变量fetchedResultsController:NSFetchedResultsController={
//初始化提取请求
let fetchRequest:NSFetchRequest=NSFetchRequest(entityName:“访问”)
//添加排序描述符
let predicate=NSPredicate(格式:“person=%@”,self.person!)
fetchRequest.predicate=谓词
让sortDescriptor=NSSortDescriptor(键:“日期”,升序:false)
fetchRequest.sortDescriptors=[sortDescriptor]
//初始化获取的结果控制器
设fetchedResultsController=NSFetchedResultsController(fetchRequest:fetchRequest,managedObjectContext:self.managedObjectContext,sectionNameKeyPath:nil,cacheName:nil)
//配置获取的结果控制器
fetchedResultsController.delegate=self
将fetchedResultsController返回为!NSFetchedResultsController
}()
我要重申,这一切都是完美的,正如从顶部使用应用程序时所预期的那样,它只有在尝试恢复状态时才会崩溃
我做了很多不同的尝试,试图用什么来设置encoderestorablestate,但没有任何东西能够阻止崩溃。这似乎会出现很多问题,但我找不到任何信息,这让我感到困惑
谢谢您的时间。您没有提供足够的信息来追踪问题,但这里有一个解决问题的一般方法。把这个问题分为三个部分:
- 您有一个实现
的还原类。这是一个配置您提供的视图控制器的机会viewController(带有restorationIdentifierPath:coder:)
- 视图控制器被发送到decodeRestorableState(带:)。这是配置视图控制器的另一个机会。请注意,这是在
之后出现的viewDidLoad
- 视图控制器将被发送到applicationFinishedRestoringState。这是配置视图控制器的最后一次机会
viewDidLoad
中有代码,该代码假定所有属性都已设置,并相应地配置接口。但在这种情况下,它们可能尚未设置
因此,要使状态恢复工作,您需要重写viewDidLoad
代码,以不对是否已设置属性进行假设
在您的情况下,这将是self.person
。在viewdiload
中,您需要检查self.person
,如果它是nil
,则不要尝试使您的获取结果成为控制器。然后出现了applicationFinishedRestoringState
,现在您可能已经配置了self.person
(在decodeRestorableState
中),并且您可以通过获取的结果控制器更新界面