2016-11-10 5 views
0

Я пытаюсь реализовать восстановление состояния в проекте Core Data (Swift), и у меня возникают проблемы с реализацией протокола UIDataSourceModelAssociation в источнике данных для UITableView в контроллере разделенного представления, который является классом-оболочкой вокруг 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 путь/к/выходной_файл

Если просмотреть полученный файл Plist с предварительным просмотром, я получаю следующее:

kApplicationSelectedCellIndexPathsKey ... ("< NSIndexPath: 0x7fe60054cb00 > {длина = 2, путь = 0 - 3}")

... но если я открою plist в Xcode, я получаю следующее:

kApplicationSelectedCellIndexPathsKey для ключа, но только с (для значения

предполагающего декодер использует тот же алгоритм, как читатель Plist для преобразования файла данных, то не было бы удивительно, чтобы получить какое-то исключение.

Если я удалю расширение UIDataSourceModelAssociation, исключение исчезнет.

Может ли кто-нибудь еще подтвердить эту проблему или я пропустил что-то действительно очевидное?

ответ

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?