iOS 11中UIDocumentMenuViewController替代方案及自定义实现问询
1. 能不能复刻被弃用的UIDocumentMenuViewController的外观与交互?
首先得明确:苹果在iOS11之后彻底弃用了UIDocumentMenuViewController,官方并没有提供直接复刻它那种底部弹出菜单+文档提供者选项的方案。现在系统统一用UIDocumentPickerViewController的全屏模态样式来处理文档选择。
不过如果你非要接近原来的效果,有两个可行思路:
- 自定义底部菜单:自己写一个类似的底部弹窗(比如用
UIAlertController的actionSheet样式,或者自定义View),把你需要的文档入口(比如iCloud、本地文件、常用第三方App)做成选项。用户选完后,再针对性地跳转到UIDocumentPickerViewController的对应位置。这种方式能模拟外观,但所有交互逻辑都要自己实现,尤其是第三方文档提供者的集成会比较繁琐,得手动处理跳转逻辑。 - 适配UIDocumentPickerViewController的模式:虽然没法回到菜单样式,但可以通过调整它的
documentPickerMode来匹配原来的功能(比如导入、导出等),不过外观上还是系统的全屏样式。
2. 能不能强制UIDocumentPickerViewController直接进入“Locations”界面?
可以!这里有个实用的技巧,关键在于初始化时的参数设置:
代码示例(Swift)
// 用通用的文档类型,确保覆盖所有文件类型,避免picker直接跳转到特定提供者 let documentTypes = [String(kUTTypeItem)] // 初始化picker,选择合适的模式(这里用.import,根据你的需求调整为.open或.exportToService) let picker = UIDocumentPickerViewController(documentTypes: documentTypes, in: .import) // 关键:不要设置特定的directoryURL,或者如果需要默认到某个位置再设置 // 如果想直接显示所有Locations列表,就不要设置directoryURL,让picker默认加载根位置 // 如果你想默认进入iCloud的Documents目录,可以这么设置: if let iCloudContainerURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents") { picker.directoryURL = iCloudContainerURL } // 最后present这个picker即可 present(picker, animated: true)
注意事项
- 一定要用通用的文档类型(比如
public.item),如果你的documentTypes设置得太具体(比如只支持图片),picker可能会直接跳转到照片App这种特定提供者,而不是Locations界面。 - 在iOS11中,
directoryURL属性是可用的,设置它可以让picker直接跳转到指定目录;如果不设置,picker就会默认显示Locations列表,而不是最近使用的文档提供者。
总结
- 完全复刻
UIDocumentMenuViewController的官方方案不存在,只能通过自定义界面实现近似效果; - 强制
UIDocumentPickerViewController进入Locations界面是可以做到的,核心是正确设置文档类型和避免指定不必要的初始目录。
内容的提问来源于stack exchange,提问作者user1210182
相关产品推荐
相关产品推荐

