0

Core Data プロジェクト (Swift) に状態復元を実装しようとしていますが、NSFetchedResultsController のラッパー クラスである分割ビュー コントローラーの UITableView のデータ ソースに 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  }  

「static Foundation.IndexPath._unconditionallyBridgeFromObjectiveC (Swift.Optional<__ObjC.NSIndexPath>) -> Foundation の問題を指摘しているように見える状態の復元時に、AppDelegate クラスの上部でデバッガーを停止する EXC_BAD_INSTRUCTION 例外が発生しています。 .IndexPath".

私はrestoreArchiveToolを使用して、結果のdata.dataファイルをsavedStateフォルダーからコマンド「.../restorationArchiveTool --plist --structured -o path/to/outputfile」でplistに変換します

結果の plist ファイルをプレビューで表示すると、次のようになります。

kApplicationSelectedCellIndexPathsKey...( "<NSIndexPath: 0x7fe60054cb00> {長さ = 2、パス = 0 - 3}")

...しかし、Xcodeでplistを開くと、次のようになります:

キーは kApplicationSelectedCellIndexPathsKey ですが、値は ( だけです

デコーダーがデータ ファイルの変換に plist リーダーと同じアルゴリズムを使用すると仮定すると、何らかの例外が発生しても驚くことではありません。

UIDataSourceModelAssociation 拡張機能を削除すると、例外はなくなります。

他の誰かがこの問題を確認できますか、それとも本当に明らかなことを見逃していますか?

4

1 に答える 1

0

あなたの関数には署名があります:

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?
于 2017-01-06T04:11:02.173 に答える