如何在NSOpenPanel中使用setAllowedContentTypes设置多种文件类型
在macOS 12.2中给NSOpenPanel设置多种专属应用文件类型
没问题,针对你要限制NSOpenPanel仅允许打开自家应用专属文件的需求,我给你梳理一下具体实现步骤,确保精准又安全:
核心思路:用专属UTI而非单纯扩展名
单纯靠扩展名过滤容易和其他应用撞车,而你司注册的**统一类型标识符(UTI)**是系统认可的专属标识,能精准锁定属于你应用的文件。
具体实现步骤
确保Info.plist已注册专属UTI
首先要在你应用的Info.plist里添加对应文件类型的注册信息,比如你有两种专属文件类型(假设UTI为com.yourcompany.ach和com.yourcompany.customdoc),需要添加CFBundleDocumentTypes数组,示例配置大概是这样的:<key>CFBundleDocumentTypes</key> <array> <dict> <key>CFBundleTypeName</key> <string>ACH File</string> <key>LSHandlerRank</key> <string>Owner</string> <key>LSItemContentTypes</key> <array> <string>com.yourcompany.ach</string> </array> </dict> <dict> <key>CFBundleTypeName</key> <string>Custom Document</string> <key>LSHandlerRank</key> <string>Owner</string> <key>LSItemContentTypes</key> <array> <string>com.yourcompany.customdoc</string> </array> </dict> </array>这一步是让系统识别这些文件属于你司应用的前提。
在NSOpenPanel中设置允许的UTI数组
接下来在代码里创建包含所有专属UTI的数组,然后赋值给allowedContentTypes即可。这里有两种方式获取UTI:直接使用注册好的UTI标识符(推荐)
如果你已经明确知道UTI的字符串,可以直接构造数组:// 替换成你司实际注册的UTI NSArray *allowedContentTypes = @[UTTypeCreatePreferredIdentifierForTag(kUTTagClassIdentifier, @"com.yourcompany.ach", nil).takeRetainedValue(), UTTypeCreatePreferredIdentifierForTag(kUTTagClassIdentifier, @"com.yourcompany.customdoc", nil).takeRetainedValue()]; [openfilepanel setAllowedContentTypes:allowedContentTypes];通过扩展名获取对应的UTI
如果你习惯用扩展名来指定,也可以通过扩展名映射到UTI:NSArray *allowedContentTypes = @[UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, @"ach", nil).takeRetainedValue(), UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, @"cust", nil).takeRetainedValue()]; [openfilepanel setAllowedContentTypes:allowedContentTypes];
额外提示
- 确保调用
setAllowedContentTypes时,数组里的UTI都是你司应用有权处理的(也就是Info.plist里注册过的),这样面板才会正确过滤。 - macOS 12.2中
allowedContentTypes是官方推荐的API,取代了旧的allowedFileTypes,建议坚持使用这个属性。
- 确保调用
这样设置后,NSOpenPanel就只会显示属于你司应用的文件类型,其他类型会被隐藏或无法选中。
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

