Xcode 8.1 UIDataSourceModelAssociation 坏了?
Xcode 8.1 UIDataSourceModelAssociation broken?
我正在尝试在核心数据项目 (Swift) 上实现状态恢复,但在拆分视图控制器中的 UITableView 的数据源上实现 UIDataSourceModelAssociation 协议时遇到问题,它是一个包装器class 围绕 NSFetchedResultsController。
代码是:
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 class 顶部停止调试器,状态恢复似乎指向 "static Foundation.IndexPath._unconditionallyBridgeFromObjectiveC (Swift.Optional<__ObjC.NSIndexPath>) -> Foundation.IndexPath" 的问题。
我使用 restorationArchiveTool 将生成的 data.data 文件从 savedState 文件夹转换为 plist,命令为“.../restorationArchiveTool --plist --structured -o path/to/outputfile
如果我使用预览查看生成的 plist 文件,我得到以下信息:
kApplicationSelectedCellIndexPathsKey...( " {length = 2, path = 0 - 3}")
...但是如果我在 Xcode 中打开 plist,我会得到以下信息:
kApplicationSelectedCellIndexPathsKey 作为键,但只有 ( 作为值
假设解码器使用与 plist 相同的算法 reader 来转换数据文件,得到某种异常也就不足为奇了。
如果我删除 UIDataSourceModelAssociation 扩展,异常就会消失。
其他人可以确认这个问题吗?或者我错过了一些非常明显的事情吗?
您的函数具有签名:
indexPathForElement(withModelIdentifier identifier: String, in view: UIView) -> IndexPath?
这就是为什么你应该将 return 类型转换为 IndexPath
而不是 NSIndexPath
:
return self.fetchedResultsController.indexPath(forObject: object) as NSIndexPath?
到
return self.fetchedResultsController.indexPath(forObject: object) as IndexPath?
我正在尝试在核心数据项目 (Swift) 上实现状态恢复,但在拆分视图控制器中的 UITableView 的数据源上实现 UIDataSourceModelAssociation 协议时遇到问题,它是一个包装器class 围绕 NSFetchedResultsController。 代码是:
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 class 顶部停止调试器,状态恢复似乎指向 "static Foundation.IndexPath._unconditionallyBridgeFromObjectiveC (Swift.Optional<__ObjC.NSIndexPath>) -> Foundation.IndexPath" 的问题。
我使用 restorationArchiveTool 将生成的 data.data 文件从 savedState 文件夹转换为 plist,命令为“.../restorationArchiveTool --plist --structured -o path/to/outputfile
如果我使用预览查看生成的 plist 文件,我得到以下信息:
kApplicationSelectedCellIndexPathsKey...( "
...但是如果我在 Xcode 中打开 plist,我会得到以下信息:
kApplicationSelectedCellIndexPathsKey 作为键,但只有 ( 作为值
假设解码器使用与 plist 相同的算法 reader 来转换数据文件,得到某种异常也就不足为奇了。
如果我删除 UIDataSourceModelAssociation 扩展,异常就会消失。
其他人可以确认这个问题吗?或者我错过了一些非常明显的事情吗?
您的函数具有签名:
indexPathForElement(withModelIdentifier identifier: String, in view: UIView) -> IndexPath?
这就是为什么你应该将 return 类型转换为 IndexPath
而不是 NSIndexPath
:
return self.fetchedResultsController.indexPath(forObject: object) as NSIndexPath?
到
return self.fetchedResultsController.indexPath(forObject: object) as IndexPath?