2015-11-13 1 views
6

Я просто переименовал свой проект Xcode, и когда я побежал, я получил эту ошибку:NSKeyedUnarchiver ошибка после переименования Xcode проекта

2015-11-14 05:32:42.337 Buck Tracker[3537:1456100] * Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '* -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (iBudgeter.Record) for key (NS.objects); the class may be defined in source code or a library that is not linked'

Buck Tracker новое имя и iBudgeter это оригинальное название. Record обычай NSObject Я создал для хранения некоторых данных.

Я попытался переименовать проект обратно в iBudgeter, но он не сработал. Возвращение к предыдущей версии в git действительно помогло, но я получил ту же ошибку, когда переименовал ее снова.

Значит, любые предложения?

+0

ли 'Бак Tracker' соответствовать к' протоколу NSCoding'? – JAL

+0

Вы пытались сделать «чистый»? – azimov

+0

@ hal9000 Я сделал, но это не сработало –

ответ

6

Не изменяйте название проекта. Просто измените отображаемое имя. Это запись «Отображаемое имя пучка» в вашем Info.plist. Вам, вероятно, потребуется добавить запись.

adding Bundle display name to Info.plist

См this answer, если вы хотите изменить отображаемое имя в OS X приложения.

+0

Wow you life life! Не знаю, я могу это сделать: D –

+0

Как вы это сделаете, если хотите изменить имя не только на отображаемое имя? – user3798602

14

Другой способ - исправить имя класса, используемого для NSCoding. Вы просто должны использовать:

  • NSKeyedArchiver.setClassName("Record", forClass: Record.self перед сериализацией
  • NSKeyedUnarchiver.setClass(Record.self, forClassName: "Record") перед тем десериализации

везде, где это необходимо.

Похоже, что расширения iOS префиксное имя класса с именем расширения.

+0

Ты спас меня. Оно работает! –

1

В том случае, если вы переместили свой файл в другой модуль, вам нужно будет добавить дополнительную информацию

NSKeyedArchiver.setClassName("OldModule.ClassName", for: ClassName.self) 
NSKeyedUnarchiver.setClass(ClassName.self, forClassName: "OldModule.ClassName")