在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
相关产品推荐
相关产品推荐

