iOS之文件拖入项目中的多个选项区别

号外!!!
文末有关于xcode9 Beta拖动文件的更新注意点

一、选项认识

我们在做项目的时候时常会遇见需要导入一些类文件和资源文件之类的,当我们往项目中拖入这些文件的时候就会出现一些选项,这个时常会让我魂牵梦绕,有时候就因为这个问题搞了老半天,所以现在准备好好的跟大家聊一聊这几个选项。首先我们看看有哪几个选项,请看以下截图:

Snip20170518_242.png

那这个就是我们经常遇见的了,我们在下文中按照顺序把这几个选项说成1234选项,如果说勾选124选项那么就是下图中第一个和第二个和第四个选项选中了,具体请看勾选了124的下图:

Snip20170518_251.png

各选项

  • 选项1 (Destination: Copy items if needed)
  • 选项2 (Added folders:create groups)
  • 选项3 (Added folders:create folder references):
  • 选项4 (Add to targets)

PS: 以上是用拖入的方式,如果我们采用Add Files to "......"这种方式其实也是一样的,也能够出现以上的这四个选项:

Snip20170703_124.png

那怎么把这四个选项弄出来呢,通过以下这种方式,点击options:


Snip20170703_125.png
Snip20170703_126.png
二、获取路径

要说这四个选项就要说到几个文件路径了

  • 项目工程路径:
Snip20170519_265.png
  • 原文件所处路径:这个我都是放在桌面上,所有以下会用到的原文件的路径都在桌面上,并且我已经分了类,有图片资源和其他类型的资源文件(此处为数据库文件),有源文件,有文件夹,如下图:
Snip20170519_258.png
  • Bundle所在路径,我通过以下代码获取了Bundle路径(这个也就是包路径):
- (void)getTheBundlePath{
    NSString *path = [[NSBundle mainBundle] bundlePath];
    NSLog(@"BundlePath = %@",path);
}

打印之后结果如下:

BundlePath = /Users/kodie/Library/Developer/CoreSimulator/Devices/CCDD5424-A30E-40A4-9DE7-D6F05E2E5FDA/data/Containers/Bundle/Application/B6D499F2-9584-4CDB-8B37-54010B9EF754/KODTESTTEST.app
Snip20170519_259.png

右键显示包内容:


Snip20170519_262.png
Snip20170519_264.png

PS:注意这个Bundle路径每次运行之后都会变的,先把原来生成的文件夹删除掉然后再新建一个Bundle路径:

BundlePath.gif

PS:获取Bundle路径还有一种方法,如下:

Snip20170519_285.png
  • 沙盒路径,通过以下代码获取沙盒路径:
- (void)getTheSandboxPath{
    NSString *path = NSHomeDirectory();
    NSLog(@"SandboxPath = %@",path);
}

打印如下:

SandboxPath = /Users/kodie/Library/Developer/CoreSimulator/Devices/CCDD5424-A30E-40A4-9DE7-D6F05E2E5FDA/data/Containers/Data/Application/535DA1FB-D454-400A-969B-98B71B7ADA07

沙箱路径在模拟器中也是类似Bundle一样的效果,但是沙箱最后能定位到改变之后的位置,这个很奇怪,Bundle路径是不可以的,我感觉Bundle每次运行之后因为里面的内容变了就是变了,但是沙箱的是程序运行的路径,所以每次运行之后运行时产生的数据和临时数据都是需要存储和保存的,所以沙箱的路径最后能定位出来,但是Bundle就没有这样的设置需要了。当然这个是在模拟器中,如果在真机中应该Bundle和沙盒路径一旦生成都是不变的应该(这个如果哪位大神有更好的见解,可以提出来帮助我改正):

Snip20170519_266.png
Sandbox.gif
三、选项1(Destination)的作用

首先由于选项1是可以可选可不选的,选项2和3是必须选一个,选项4也是可选可不选的,那么我们先确定选项1的作用。

选项1:Destination : Copy items if needed

根据多次拖拽后发现这个选项的作用仅限于是否将原文件拷贝到工程中你拖拽所在的位置,如果勾选那么会将原文件拷贝一份到工程目录中你拖拽的相应位置,如果选择不勾选,那么就不会拷贝一份到工程目录中,但是一定会在打开的工程中看见此文件会放在拖拽的相应位置。此处选项2、3任意勾选和4勾不勾选都不会影响1的作用,因为1只是拷贝文件到工程目录底下,所以以下我们选择24都勾选来做

  • 勾选1:
    原文文件(存放在桌面):
Snip20170519_271.png

拖入工程勾选124


Snip20170519_269.png

工程中:

Snip20170519_270.png

工程目录中:

Snip20170519_272.png
  • 不勾选1:
    原文件不变(存放在桌面):
Snip20170519_271.png

拖入工程我选择24:

Snip20170519_274.png

工程中:

Snip20170519_275.png

工程目录中:

Snip20170519_277.png

PS:虽然没有拷贝一份文件到真实的工程目录中,但是会引用原文件,但会有一个缺陷,一旦原文件的路径发生了改变就无法找到对应的文件了。

四、选项2、3(Added folders)的作用

经过多次的拖拽试验发现:选项2、3对于文件来说都是一样的效果,但是对于文件夹来说就有说法了。以下是针对于文件夹来说。选择2还是选择3针对于文件夹来说只会影响是否会在生成的app文件中(或者Bundle中)存在真实路径。(另:不管2还是3都会在工程中能看见拖入的源文件或者资源文件或者文件夹)
验证思路:创建一个文件夹,文件夹中存放类源文件或者资源文件,然后将这个文件夹拖入工程中。此处1就不再验证了,所以勾选1不1的也就不重要了,那么我们此处默认勾选4.
文件夹(存放在桌面上):

Snip20170519_287.png

文件夹中内容:

Snip20170519_286.png

选项2:Create groups
不会在生成的.app文件(Bundle文件)中存在真实文件夹

勾选24:


Snip20170519_288.png

工程中:

Snip20170519_293.png

PS:工程目录中是没有的因为没有勾选1,不会拷贝到工程目录中来,但是如果选择了1只要是文件夹拖入进来之后在工程目录中就是真实文件夹。

.app文件中:

Snip20170519_291.png

PS:其中源文件就是会编入KODTESTTEST可执行文件中,其他的资源文件就直接在包内。具体如上!

选项3:Create folder references
会在生成的.app文件(Bundle文件)中存在真实文件夹,并且内部存放资源文件

  • 勾选34:


    Snip20170519_292.png

工程中:

Snip20170519_294.png

PS:以上中文件夹是蓝色的!!!
PS:工程目录中是没有的因为没有勾选1,不会拷贝到工程目录中来,但是如果选择了1只要是文件夹拖入进来之后在工程目录中就是真实文件夹。

.app文件中:

Snip20170519_295.png

PS:其中源文件不会编入KODTESTTEST可执行文件中,所有的文件都还是在此目录下待着!!!
PS:这也表明我们选择34在拖入整个文件夹内容的时候,xcode不会自动把文件夹下的源文件放入以下的Compile sources中,而选择24的时候就会把文件夹下的源文件放入Compile sources然后让源文件参与编译最终形成可执行文件:

Snip20170519_296.png

即便我们手动去添加的时候也发现不能直接点开此文件夹展示子文件去选择子文件编译


Snip20170519_297.png

总结:所以这个3一般是我们在项目中作为资源文件夹来使用的,里面存放项目中需要使用的资源,并且我们再次往里面添加资源文件的时候是不会再次弹出勾选124的对话框,往里面拖什么就要什么!

五、选项4(Add to targets)的作用

经过多次拖拽试验,得出的结果是勾选了4之后就会在你所选择的target最后生成的.bundle中或者.app中或者.framework中(这三者中关于选择2\3的不同在最后给出截图)。反之如果不勾选那么就不会存在于生成的.app/.framework/.bundle中了。
以下测试以.app为例,并且以勾选2位前提

选项4:Add to targets加入到某个或者多个target

PS:给大家推一篇关于Target的:iOS的多Target应用
原文件(存放在桌面上):

Snip20170519_298.png
  • 不勾选4:
Snip20170519_300.png

工程中:

Snip20170519_301.png

.app中:

Snip20170519_302.png
  • 勾选4:
Snip20170519_304.png

工程中:

Snip20170519_305.png

.app中:

Snip20170519_306.png

PS:综上所述,大家应该很清楚4只跟你运行之后生成的.app或者.bundle/.framework等有关

说到这里大家可能会问,如果我第一次没有勾选4怎么办呢?那我们这里手动教大家怎么把丢失的4给找回来:
如果是源文件,我们这里选择在Compile sources下添加相应的文件,然后会编入.app的可执行文件中:

Snip20170519_307.png
Snip20170519_308.png
Snip20170519_309.png
Snip20170519_310.png

如果是资源文件,我们这里选择在Copy Bundle Resources下添加相应的资源文件,然后会存放在包中:

Snip20170519_311.png
Snip20170519_312.png
Snip20170519_313.png
Snip20170519_314.png
六、总结
  • 选项1的作用是将原文件拷贝到工程目录下,如果不勾选1那么就不会拷贝,但是依然会引用原文件。一旦原文件的文件的路劲改变了,那么工程就会找不到该文件。
  • 选项2/3的作用对于文件来说无所谓,但是对于文件夹来说就有区别了。如果是文件夹勾选了2的话那么不会在生成的.app或者.bundle或者.framework中有对应的文件夹,并且原文件夹下的源文件会参与编译(当然这个是勾选了4的情况下或者Compile sources)生成可执行文件,原文件夹下的资源文件包括图片、plist文件或者其他资源文件会放在生成的.app或者.bundle或者.framework中对应位置(当然勾选了4,或者手动添加了Copy Bundle Resources),具体位置我会在文末结束的时候都给大家贴出。
  • 选项4的作用是添加到对应的Targget,那么就决定了这个导入的文件或者文件夹会不会存在.app或者.bundle或者.framework中中。
七、文末扩展一

扩展一:针对于不同的Target存放的文件和文件夹存放的路径,看以下文件会存放在哪儿:

  • .app


    Snip20170519_317.png
Snip20170519_315.png
Snip20170519_323.png

右键显示包内容:

Snip20170519_326.png

存放在Resource底下的:

Snip20170519_328.png
Snip20170519_330.png

运行后show in finder:

Snip20170519_329.png
Snip20170519_331.png
八、文末扩展二

扩展二:删除文件或者文件夹的时候,会出现一个对话框,如下图,那么我们该选择哪一个呢?

Snip20170519_332.png

Xcode9 Beta拖动文件更新注意点

注意了,我们如果升级到Xcode9 Beta版本后,再将别处的文件直接拖入到工程中后,默认引用的是原文件路径,所以如果我们把原文件给删除掉之后就会出现文件找不到的错误,所以我们应该按以下方式解决

  • 首先将文件拷贝至工程目录需要放置的位置
  • 采用如下截图的方式添加文件或者将刚刚拷贝到工程目录下的文件拖入到工程中即可。
Snip20170621_6.png

以上!

呆萌.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容