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

在Xcode中如何保留文件夹结构复制资源到iOS项目目标?

如何让iOS Bundle保留文件夹结构,加载不同目录下的同名资源

刚好跟你碰到过一样的需求!Xcode默认会把项目里的文件夹当成「Groups」处理,打包时直接把所有文件扁平化丢进bundle,所以你没法通过路径区分不同子文件夹里的lesson.xml。要解决这个问题,核心就是让Xcode把文件夹当成**文件夹引用(Folder References)**来处理,具体方法如下:

方法一:重新添加文件夹为Folder References

如果已经把Lessons文件夹添加成黄色的Groups了,先别急着删文件:

  • 右键项目导航区里的Lessons文件夹,选择「Remove Reference」(选这个只会移除项目里的引用,不会删掉本地的实际文件)
  • 然后右键项目导航区,选「Add Files to "你的项目名"…」,找到本地的Lessons文件夹
  • 关键一步!对话框底部要勾选「Create folder references」(别选默认的「Create groups」)
  • 确认勾选了对应的target,点击「Add」

添加完成后,你会看到项目里的Lessons文件夹变成蓝色的了——这就代表它是文件夹引用,打包后整个结构会完整保留在bundle里。这时候你就可以用路径加载文件了:

// 两种写法都可以
// 写法一:指定子目录
if let helloLessonUrl = Bundle.main.url(forResource: "lesson", withExtension: "xml", subdirectory: "Lessons/Hello") {
    // 成功加载Lessons/Hello/lesson.xml
}
if let fooLessonUrl = Bundle.main.url(forResource: "lesson", withExtension: "xml", subdirectory: "Lessons/Foo") {
    // 成功加载Lessons/Foo/lesson.xml
}

// 写法二:直接用完整路径
if let helloLessonUrl = Bundle.main.url(forResource: "Lessons/Hello/lesson", withExtension: "xml") {
    // 同样能正常加载
}

方法二:修改现有文件夹的属性(不用重新添加)

如果不想重新添加文件夹,也可以手动改属性:

  • 在项目导航区选中Lessons文件夹
  • 打开右侧的「File Inspector」(快捷键是⌥⌘1)
  • 找到「Location」选项,把原来的「Relative to Group」改成「Relative to Project」,同时确保「Folder Type」是「Folder Reference」
  • 最后清理一下项目(⇧⌘K),重新构建,bundle里就会保留完整的文件夹结构了

小提示

如果之后需要遍历某个子文件夹里的所有文件,还可以用这个方法获取所有文件的URL:

if let lessonUrls = Bundle.main.urls(forResourcesWithExtension: "xml", subdirectory: "Lessons") {
    // lessonUrls里包含了Lessons目录下所有xml文件的URL
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:40:27