Swift4开发macOS文档应用:如何让保存对话框显示可选格式
解决macOS文档应用“另存为”不显示导出格式的问题
我之前开发macOS文档类应用时也踩过这个坑!给你几个关键的排查和解决步骤,应该能让“另存为”对话框显示出格式选择下拉:
1. 确保Info.plist的NSExportableTypes配置完整
你需要在自定义文件类型的CFBundleDocumentTypes条目里,把所有支持导出的类型UTI都加入NSExportableTypes数组,包括你的自定义类型和public.plain-text(纯文本的系统UTI)。同时要保证每个导出类型的UTI是有效的:
- 自定义类型要在
UTExportedTypeDeclarations里正确声明(包含UTTypeIdentifier、UTTypeDescription、UTTypeConformsTo和UTTypeTagSpecification) - 纯文本用系统内置的
public.plain-text即可,无需额外声明
举个Info.plist的配置示例:
<key>CFBundleDocumentTypes</key> <array> <dict> <key>CFBundleTypeName</key> <string>我的自定义文档</string> <key>CFBundleTypeRole</key> <string>Editor</string> <key>LSItemContentTypes</key> <array> <string>com.yourteam.yourapp.customdoc</string> </array> <key>NSExportableTypes</key> <array> <string>com.yourteam.yourapp.customdoc</string> <string>public.plain-text</string> </array> </dict> </array> <key>UTExportedTypeDeclarations</key> <array> <dict> <key>UTTypeIdentifier</key> <string>com.yourteam.yourapp.customdoc</string> <key>UTTypeDescription</key> <string>我的自定义文档</string> <key>UTTypeConformsTo</key> <array> <string>public.data</string> </array> <key>UTTypeTagSpecification</key> <dict> <key>public.filename-extension</key> <array> <string>mydoc</string> </array> </dict> </dict> </array>
2. 完善NSDocument子类的关键方法
系统会根据文档类的实现来决定显示哪些导出格式,这一步很容易被忽略:
- 实现
writableTypes(for:)方法,返回所有支持的可写类型UTI数组 - 实现
data(ofType:)方法,针对不同类型处理对应的导出逻辑
示例Swift代码:
class CustomDocument: NSDocument { // 存储你的文档内容 var documentContent: String = "" override func writableTypes(for saveOperation: NSDocument.SaveOperationType) -> [String] { // 返回支持的导出类型 return ["com.yourteam.yourapp.customdoc", "public.plain-text"] } override func data(ofType typeName: String) throws -> Data { switch typeName { case "public.plain-text": // 导出为纯文本 guard let data = documentContent.data(using: .utf8) else { throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil) } return data case "com.yourteam.yourapp.customdoc": // 导出为自定义格式(这里用JSON举例) let exportDict = ["content": documentContent] return try JSONSerialization.data(withJSONObject: exportDict, options: .prettyPrinted) default: throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil) } } }
3. 清理缓存并重启
macOS有时会缓存Info.plist的配置,导致修改不生效。建议:
- 清理Xcode的Derived Data(Xcode > Settings > Locations > Derived Data > 点击路径打开后删除对应文件夹)
- 重启Xcode,重新编译运行应用
- 如果还是不行,尝试重启你的Mac
按照这几步操作后,“另存为”对话框应该就能正常显示格式选择下拉列表了!
内容的提问来源于stack exchange,提问作者Tracer Bullet
相关产品推荐
相关产品推荐

