在更改项目名称后,我遇到(我认为)命名空间的问题。这是错误:
由于未捕获的异常'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]
}
答案 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>资源>字符串文件“模板:
然后将InfoPlist.strings
本地化为Base本地化:
在字符串文件中,将新名称指定给CFBundleName
键,如下所示:
CFBundleName = "Pear";
如果您在CFBundleDisplayName
中设置了Info.plist
密钥,则应将新名称指定给CFBundleDisplayName
中的InfoPlist.strings
。如果您未在CFBundleDisplayName
中设置Info.plist
密钥,则无需在InfoPlist.strings
中进行设置。
这足以让您的应用在其菜单栏和Finder中显示其新名称。但是,您的旧名称仍会在MainMenu.xib
或Main.storyboard
的多个位置以硬编码方式显示。您可以通过选择菜单栏>找到它们。查找>找到...(默认快捷键:⌘F),如下所示:
您需要将这些更改为“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即可。