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

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:,在方法内返回自定义名称:

  1. 确保文档浏览器子类已设置代理(模板通常默认配置,若未设置则在初始化时添加 self.delegate = self;)
  2. 实现代理方法:
- (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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:06:42