重命名OSX的Xcode项目后出现NSKeyedUnarchiver错误

时间:2015-12-15 02:37:54

标签: xcode macos core-data

在更改项目名称后,我遇到(我认为)命名空间的问题。这是错误:

  

由于未捕获的异常'NSInvalidUnarchiveOperationException'终止应用程序,原因:'* - [NSKeyedUnarchiver decodeObjectForKey:]:无法解码类(Apple.Document)的对象(NS.objects);该类可以在源代码中定义,也可以在未链接的库中定义

有一个类似的问题here,但这是指iOS。对于Mac,只需更改display bundle name即可更改停靠栏中图标下显示的名称。

将项目名称从“Apple”更改为“Pear”后, 从CoreData获取Document个对象时遇到问题:

    // Document
    @objc(Document)
    class Document: NSManagedObject {
        @NSManaged var content: NSAttributedString
    }

文档的content包含SpecialTextAttachment s。

    // SpecialTextAttachment
    class SpecialTextAttachment: NSTextAttachment {
        //
    }

打印文档内容时,它会给出上述错误。我如何将Apple.SpecialTextAttachment转换为Pear.SpecialTextAttachment?看起来我需要在迭代Document数组之前转换它,因为只是引用Document类会导致崩溃。我也不能像建议的here那样只针对这个类创建另一个项目。

    // in ViewController
    func getDocuments() {
        let fetchRequest = NSFetchRequest()
        fetchRequest.entity = NSEntityDescription.entityForName("Document", inManagedObjectContext: managedObjectContext!)
        fetchRequest.fetchBatchSize = 20
        let docs = (try? managedObjectContext!.executeFetchRequest(fetchRequest)) as! [Document]

    }

3 个答案:

答案 0 :(得分:3)

我有点放弃了这一点,并继续决定重新命名该项目。

所以在我的类的init()中包含了处理来自CoreData的数据的所有方法,我放置了以下代码:

class CoreDataHelper {
    init() {
        NSKeyedUnarchiver.setClass(SpecialTextAttachment.self, forClassName: "Apple.SpecialTextAttachment")
    }
}

这将在Apple.SpecialTextAttachment可能出现的任何即将进行的操作中将Pear.SpecialTextAttachment转换为SpecialTextAttachment

答案 1 :(得分:1)

您可以在不更改软件包名称的情况下更改OS X上应用程序的显示名称。该程序与iOS上的程序略有不同。

首先,如果您还没有,则需要为您的应用创建InfoPlist.strings文件。使用“OS X>资源>字符串文件“模板:

Creating InfoPlist.strings

然后将InfoPlist.strings本地化为Base本地化:

Creating InfoPlist.strings Base localization

在字符串文件中,将新名称指定给CFBundleName键,如下所示:

CFBundleName = "Pear";

Setting CFBundleName in InfoPlist.strings

如果您在CFBundleDisplayName中设置了Info.plist密钥,则应将新名称指定给CFBundleDisplayName中的InfoPlist.strings。如果您未在CFBundleDisplayName中设置Info.plist密钥,则无需在InfoPlist.strings中进行设置。

这足以让您的应用在其菜单栏和Finder中显示其新名称。但是,您的旧名称仍会在MainMenu.xibMain.storyboard的多个位置以硬编码方式显示。您可以通过选择菜单栏>找到它们。查找>找到...(默认快捷键:⌘F),如下所示:

finding Apple in MainMenu.xib

您需要将这些更改为“Pear”。 (从技术上讲,您不必更改“Apple”菜单标题,因为AppKit会在运行时将其更改为InfoPlist.strings中的本地化字符串,但如果您只是更改所有实例,它会更简单“Apple”到“Pear”。)

如果您对其他语言有实际本地化,并且您希望将应用名称本地化,则需要将InfoPlist.strings本地化到每个本地化并设置CFBundleName(和每个人都可以CFBundleDisplayName

答案 2 :(得分:0)

之所以发生这种情况,是因为您的* .xcodeproj(project.pbxproj)默认使用产品名称的$(TARGET_NAME)和其他字段中的$(PRODUCT_NAME)。例如,默认情况下,“产品模块名称”设置为$(PRODUCT_NAME:c99extidentifier)。您只需在Build Settings中将所有PRODUCT_NAME替换为TARGET_NAME即可。