swift - 将具有 String 和 NSImage 属性的类导出到文件

标签 swift macos appkit nscoding

我有一个类,我希望能够打开该类并将其导出到文件。它不需要编辑 - 这只是与我的应用程序的其他用户共享部分对象 CoreData 数据库的一种方法,因此我认为我不需要子类化 NSDocument 的复杂性。

该类非常基本,有两个属性 String 和一个引用应用沙箱中图像的 NSImage 文件名。

最初,我考虑使用文档包,基本上是一个包含图像的文件夹(如果需要)以及一个包含字符串和图像文件名的 plist。 现在,我倾向于创建一个仅用于导出和导入的类,它使用 NSCoding 将图像和字符串保存到文件中。

这是我不确定的事情:

  • 这是个好主意吗?我在这里错过了什么吗?
  • 我可以将具有 NSImageString 属性的对象数组保存到单个文件中吗?我知道我可以相当轻松地保存图像,但是我可以将它们捆绑到一个文档中吗? NSCoding 是执行此操作的方法吗?
  • 我需要先将 NSImage 转换为 NSData 吗?
  • 我的解码器如何知道文件的哪一部分是 String 以及哪一部分是 NSImage

我已经研究过了!有很多关于保存图像或保存 NSDocument 的信息,但我只是想要一种简单的方法,让用户可以将任意数据导出和导入到我的文件中。应用程序的核心数据存储。

最佳答案

使用NSCoding,您可以保存每个内置支持该协议(protocol)的类,或者添加它。 NSImage 和 – 当然 – NSString 都符合 NSCoding。您只需将 NSCoding 支持添加到您的自定义类 which is pretty simple :

- (void)encodeWithCoder:(NSCoder*)coder
{
  [coder encodeObject:self.stringProperty forKey:@"String Property"];
  [coder encodeObject:self.imageProperty forKey:@"Image Property"];
}

- (instancetype)initWithCoder:(NSCoder*)coder
{
  self = [super init]; // or `-initWithCoder:, if it is supported
  if (self)
  {
    self.stringProperty = [coder decodeObjectForKey:@"String Property"];
    self.imageProperty = [coder decodeObjectForKey:@"Image Property"];
  }
  return self;
}

如果您想将数据保存为属性列表文件,您只能使用属性列表类。 NSString is a property list, but NSImage is not – 当然你的自定义类不是。因此,您必须将 NSImage 的实例和自定义类转换为 NSData 的实例,因为 NSData 是一个属性列表。你可以用 –drum-roll –NSCoding 来做到这一点。只需使用带 key 的存档器即可。 +archivedDataWithRootObject: (NSKeyedArchiver) 的结果是 NSData 的实例。返回的方式是使用 NSKeyedUnarchiver

但是,如果您不想使用通用属性列表工具对其进行编辑,那么选择属性列表的文件格式就没有什么理由。

因此,直接回答您的问题:

is this a good idea? Am I missing something here?

没关系

can I save an array of objects with NSImage and String properties into a single file?

由于 NSArray 符合 NSCoding 并且是一个属性列表,因此这两种方法都可以开箱即用。

I know I can save an image, fairly easily, but can I bundle them up into a single document?

您是文件的所有者并定义文件格式。继续吧。

Is NSCoding the way to do this?

是的。

Do I need to convert the NSImage to NSData first?

仅当您想要保存属性列表文件时。

关于swift - 将具有 String 和 NSImage 属性的类导出到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38047312/

相关文章:

xcode - 如何仅查看 Swift 文件的公共(public) API "header"?

ios - 根据 Swift 中的 UILabel 文本调整 UIView 高度

ios - Json - 准备继续查看详细信息

macos - 在 MacOS Mountain Lion 中使用 yasm 的简单 asm 程序

ios - 如何在删除单元格后重新加载 CollectionView

c - 如何为 macOS 构建可移植的静态 C 库

c++ - 无法在CLion(macOS)上使用CImg打开.png文件

python - 使用 Appkit 和 Python 在 OSX 上隐藏鼠标光标

swift - NSTableCellView View 中的 NSPopupButton 导致泄漏

objective-c - 过滤正在运行的应用程序列表?