Xcode 8.1 UIDataSourceModelAssociation 坏了?

Posted

技术标签:

【中文标题】Xcode 8.1 UIDataSourceModelAssociation 坏了?【英文标题】:Xcode 8.1 UIDataSourceModelAssociation broken? 【发布时间】:2016-11-10 14:29:38 【问题描述】:

我正在尝试在 Core Data 项目 (Swift) 上实现状态恢复,但在拆分视图控制器中的 UITableView 的数据源上实现 UIDataSourceModelAssociation 协议时遇到问题,该控制器是 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 类顶部的调试器,这似乎表明“静态 Foundation.IndexPath._unconditionallyBridgeFromObjectiveC (Swift.Optional<__objc.nsindexpath>) 存在问题-> Foundation.IndexPath”。

我使用 restoreArchiveTool 将结果 data.data 文件从 savedState 文件夹转换为 plist,使用命令“.../restorationArchiveTool --plist --structured -o path/to/outputfile”

如果我使用预览查看生成的 plist 文件,我会得到以下信息:

kApplicationSelectedCellIndexPathsKey...(" length = 2, path = 0 - 3")

...但是如果我在 Xcode 中打开 plist,我会得到以下信息:

kApplicationSelectedCellIndexPathsKey 为键,但只有 ( 为值

假设解码器使用与 plist 读取器相同的算法来转换数据文件,出现某种异常也就不足为奇了。

如果我删除 UIDataSourceModelAssociation 扩展,异常就会消失。

其他人可以确认这个问题还是我错过了一些非常明显的事情?

【问题讨论】:

【参考方案1】:

你的函数有签名:

indexPathForElement(withModelIdentifier identifier: String, in view: UIView) -&gt; IndexPath?

这就是为什么你应该将返回类型转换为IndexPath 而不是NSIndexPath

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

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

【讨论】:

以上是关于Xcode 8.1 UIDataSourceModelAssociation 坏了?的主要内容,如果未能解决你的问题,请参考以下文章

当我打开 .swift/.xib 文件时,XCode 8.1 崩溃

Xcode 8.1 核心数据获取特定属性

使用 Xcode 8.1 提交应用商店

更新 MacOS 和 Xcode 后 Xcode 8.1“找不到匹配的配置文件”

Xcode 8.1 beta 3 - AQDefaultDevice 消息

xcode 8.1故事板仅显示蓝线