Xcode 8.1 UIDataSourceModelAssociation破裂了吗?

问题描述:

我想在Core Data项目(Swift)上实现状态恢复,并且在分割视图控制器中的UITableView的数据源上实现UIDataSourceModelAssociation协议时出现问题,这是一个围绕NSFetchedResultsController的包装类。 的代码是:Xcode 8.1 UIDataSourceModelAssociation破裂了吗?

1 extension EventDataProvider : UIDataSourceModelAssociation   
2 {   
3   public func modelIdentifierForElement(at idx: IndexPath, in view: UIView) -> String?   
4   {   
5     let elementAtIndexPath = self.fetchedResultsController.object(at: idx)   
6    
7     return String(describing: elementAtIndexPath.objectID.uriRepresentation())   
8   }   
9   public func indexPathForElement(withModelIdentifier identifier: String, in view: UIView) -> IndexPath?   
10   {   
11     if let url = URL(string: identifier),   
12        let objectID = self.fetchedResultsController.managedObjectContext.persistentStoreCoordinator?.managedObjectID(forURIRepresentation: url),   
13        let object = self.fetchedResultsController.managedObjectContext.object(with: objectID) as? CDEvent   
14     {   
15       return self.fetchedResultsController.indexPath(forObject: object) as NSIndexPath?   
16     }   
17    
18     return nil   
19   }   
20 }   

我正在一个EXC_BAD_INSTRUCTION例外,停止调试器在AppDelegate类的顶部,在状态恢复这似乎指向与“静态Foundation.IndexPath._unconditionallyBridgeFromObjectiveC问题(Swift.Optional < __ObjC.NSIndexPath>) - > Foundation.IndexPath“。

我用restorationArchiveTool所得到的data.data文件从savedState文件夹转换为用命令的plist” .../restorationArchiveTool --plist --structured -o路径/到/ OUTPUTFILE

如果我查看与预览所得plist文件,我得到以下:

kApplicationSelectedCellIndexPathsKey ...( “< NSIndexPath:0x7fe60054cb00 > {长度= 2,路径= 0 - 3}”)

...但如果我在Xcode中打开plist,我会得到以下内容:

kApplicationSelectedCellIndexPathsKey为重点,但只有(该值

。假定解码器将相同的算法的plist读卡器,用于将数据文件,它不会令人感到意外得到某种异常。

如果我删除了UIDataSourceModelAssociation扩展,则异常消失。

其他人可以证实这个问题,或者我错过了一些非常明显的东西吗?

你的函数签名:

indexPathForElement(withModelIdentifier identifier: String, in view: UIView) -> IndexPath?

这就是为什么你应该投的返回类型IndexPath,而不是NSIndexPath

return self.fetchedResultsController.indexPath(forObject: object) as NSIndexPath? 

return self.fetchedResultsController.indexPath(forObject: object) as IndexPath?