2015-11-13 8 views
6

Umbenennung ich umbenannt nur mein Xcode-Projekt und als ich es lief habe ich diesen Fehler:NSKeyedUnarchiver Fehler nach Xcode Projekt

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'

Die Buck Tracker ist der neue Name und iBudgeter ist der ursprüngliche Name. Record ist eine benutzerdefinierte NSObject ich erstellt, um einige Daten zu speichern.

Ich habe versucht, das Projekt zurück zu iBudgeter umbenennen, aber es hat nicht funktioniert. Das Zurücksetzen auf eine frühere Version in git hat zwar geholfen, aber ich habe den gleichen Fehler bekommen, als ich es erneut umbenannt habe.

Also irgendwelche Vorschläge?

+0

Hat 'Buck Tracker' zum' NSCoding' Protokoll konform hinzufügen? – JAL

+0

hast du versucht, ein "sauberes" zu machen? – azimov

+0

@ hal9000 Ich tat, aber es hat nicht funktioniert –

Antwort

6

Ändern Sie nicht den Namen Ihres Projekts. Ändern Sie einfach den Anzeigenamen. Es ist der Eintrag "Bundle-Anzeigename" in Ihrer Info.plist. Sie müssen wahrscheinlich den Eintrag hinzufügen.

adding Bundle display name to Info.plist

Siehe this answer, wenn Sie den Anzeigenamen eines OS X App ändern möchten.

+0

Wow, du bist Lebensretter! Wusste nicht, dass ich das kann: D –

+0

Wie machst du das, wenn du den Namen nicht nur auf den Anzeigenamen ändern willst? – user3798602

14

Eine andere Möglichkeit besteht darin, den Namen der für NSCoding verwendeten Klasse zu korrigieren. Sie müssen einfach nur verwenden:

  • NSKeyedArchiver.setClassName("Record", forClass: Record.self vor
  • NSKeyedUnarchiver.setClass(Record.self, forClassName: "Record") Serialisierung vor Deserialisieren

wo immer nötig.

Sieht aus wie iOS-Erweiterungen den Klassennamen mit dem Namen der Erweiterung voranstellen.

+0

Du hast mich gerettet. Es klappt! –

1

Im Fall, wenn Sie Ihre Datei in ein anderes Modul bewegt, müssten Sie zusätzliche Informationen

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