You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cocoa文档应用无法按用户选择格式导出保存问题排查

问题分析与修复方案

你的核心问题是手动设置prepareSavePanel:的allowedContentTypes干扰了NSDocument的默认类型传递逻辑,导致用户选中的保存格式无法正确传入dataOfType:error:方法。以下是具体修复步骤:


1. 移除保存面板的手动类型限制

NSDocument会自动根据writableTypes生成保存面板的可选类型,无需手动指定allowedContentTypes,手动设置会覆盖默认的类型传递流程。修改prepareSavePanel:方法:

- (BOOL)prepareSavePanel:(NSSavePanel *)savePanel {
    savePanel.showsContentTypes = YES;
    return YES;
}

2. 清理writableTypes的冗余UTI

你的writableTypes同时包含了自定义markdown类型com.example.mrkdwn和标准类型net.daringfireball.markdown,二者存在继承关系,保留其一即可。如果要导出标准markdown格式,直接使用系统内置UTI:

+ (NSArray *)writableTypes {
    return @[
        @"net.sourceforge.foo",
        @"com.example.plain-text",
        @"net.daringfireball.markdown"
    ];
}

3. 简化UTI配置(可选)

系统已内置public.plain-text、net.daringfireball.markdown等标准UTI,无需在UTImportedTypeDeclarations中重复声明。如果不需要自定义格式,可以直接删除这两个导入类型的配置,进一步简化Info.plist。


原理说明

NSDocument架构的默认逻辑是:

  • 根据writableTypes自动生成保存面板的可选格式列表
  • 用户选中格式后,将对应的UTI自动传入dataOfType:error:方法
    手动设置allowedContentTypes会绕过这一逻辑,导致文档始终使用原生类型进行保存。

内容的提问来源于stack exchange,提问作者user1007047

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:54:52