UIDocumentBrowserViewController不调用localizedName且不遵守shouldShowFileExtensions问题
问题解决方案
问题1:shouldShowFileExtensions 属性不生效
在iOS 13及后续版本中,UIDocumentBrowserViewController 的文件扩展名显示逻辑已迁移至 UIDocumentBrowserConfiguration 配置类,直接设置控制器的 shouldShowFileExtensions 可能被配置项覆盖。正确操作是在初始化文档浏览器时,通过配置对象设置扩展名显示状态:
// 在文档浏览器子类的初始化方法或viewDidLoad中执行 UIDocumentBrowserConfiguration *config = [[UIDocumentBrowserConfiguration alloc] init]; config.showsFileExtensions = NO; // 关闭扩展名显示 self.configuration = config;
如果模板已生成初始化代码,可保留 self.shouldShowFileExtensions = NO; 作为兼容,但核心需依赖 configuration 的设置逻辑。
问题2:重写 UIDocument 的 localizedName 未被调用
UIDocumentBrowserViewController 不会主动加载每个文档的 UIDocument 实例来获取 localizedName,而是直接读取文件系统元数据。要自定义文档显示名称,需实现文档浏览器的代理方法 documentBrowser:didRequestDocumentNamesForDocumentURLs:completionHandler:,在方法内返回自定义名称:
- 确保文档浏览器子类已设置代理(模板通常默认配置,若未设置则在初始化时添加
self.delegate = self;) - 实现代理方法:
- (void)documentBrowser:(UIDocumentBrowserViewController *)controller didRequestDocumentNamesForDocumentURLs:(NSArray<NSURL *> *)documentURLs completionHandler:(void (^)(NSDictionary<NSURL *, NSString *> *))completionHandler { NSMutableDictionary<NSURL *, NSString *> *customNames = [[NSMutableDictionary alloc] init]; for (NSURL *url in documentURLs) { // 根据URL获取对应的projectName,可从缓存或文档文件内读取 NSString *projectName = [self getProjectNameForDocumentURL:url]; // 兜底使用原文件名避免显示异常 customNames[url] = projectName ?: url.lastPathComponent; } completionHandler(customNames); }
补充说明
- 若
projectName存储在文档内部,建议将其缓存到文件扩展属性或独立索引文件中,避免频繁打开文档影响性能。 - 当文档的
projectName变更时,需调用UIDocumentBrowserViewController的reloadDocument(at:)方法刷新显示。
内容的提问来源于stack exchange,提问作者Rick Holzgrafe
相关产品推荐
相关产品推荐

