號(hào)外?。?!
文末有關(guān)于xcode9 Beta拖動(dòng)文件的更新注意點(diǎn)
一、選項(xiàng)認(rèn)識(shí)
我們?cè)谧鲰?xiàng)目的時(shí)候時(shí)常會(huì)遇見需要導(dǎo)入一些類文件和資源文件之類的,當(dāng)我們往項(xiàng)目中拖入這些文件的時(shí)候就會(huì)出現(xiàn)一些選項(xiàng),這個(gè)時(shí)常會(huì)讓我魂?duì)繅?mèng)繞,有時(shí)候就因?yàn)檫@個(gè)問題搞了老半天,所以現(xiàn)在準(zhǔn)備好好的跟大家聊一聊這幾個(gè)選項(xiàng)。首先我們看看有哪幾個(gè)選項(xiàng),請(qǐng)看以下截圖:

那這個(gè)就是我們經(jīng)常遇見的了,我們?cè)谙挛闹邪凑枕樞虬堰@幾個(gè)選項(xiàng)說成1234選項(xiàng),如果說勾選124選項(xiàng)那么就是下圖中第一個(gè)和第二個(gè)和第四個(gè)選項(xiàng)選中了,具體請(qǐng)看勾選了124的下圖:

各選項(xiàng)
- 選項(xiàng)1 (Destination: Copy items if needed)
- 選項(xiàng)2 (Added folders:create groups)
- 選項(xiàng)3 (Added folders:create folder references):
- 選項(xiàng)4 (Add to targets)
PS: 以上是用拖入的方式,如果我們采用Add Files to "......"這種方式其實(shí)也是一樣的,也能夠出現(xiàn)以上的這四個(gè)選項(xiàng):

那怎么把這四個(gè)選項(xiàng)弄出來(lái)呢,通過以下這種方式,點(diǎn)擊options:


二、獲取路徑
要說這四個(gè)選項(xiàng)就要說到幾個(gè)文件路徑了
- 項(xiàng)目工程路徑:

- 原文件所處路徑:這個(gè)我都是放在桌面上,所有以下會(huì)用到的原文件的路徑都在桌面上,并且我已經(jīng)分了類,有圖片資源和其他類型的資源文件(此處為數(shù)據(jù)庫(kù)文件),有源文件,有文件夾,如下圖:

- Bundle所在路徑,我通過以下代碼獲取了Bundle路徑(這個(gè)也就是包路徑):
- (void)getTheBundlePath{
NSString *path = [[NSBundle mainBundle] bundlePath];
NSLog(@"BundlePath = %@",path);
}
打印之后結(jié)果如下:
BundlePath = /Users/kodie/Library/Developer/CoreSimulator/Devices/CCDD5424-A30E-40A4-9DE7-D6F05E2E5FDA/data/Containers/Bundle/Application/B6D499F2-9584-4CDB-8B37-54010B9EF754/KODTESTTEST.app

右鍵顯示包內(nèi)容:


PS:注意這個(gè)Bundle路徑每次運(yùn)行之后都會(huì)變的,先把原來(lái)生成的文件夾刪除掉然后再新建一個(gè)Bundle路徑:

PS:獲取Bundle路徑還有一種方法,如下:

- 沙盒路徑,通過以下代碼獲取沙盒路徑:
- (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一樣的效果,但是沙箱最后能定位到改變之后的位置,這個(gè)很奇怪,Bundle路徑是不可以的,我感覺Bundle每次運(yùn)行之后因?yàn)槔锩娴膬?nèi)容變了就是變了,但是沙箱的是程序運(yùn)行的路徑,所以每次運(yùn)行之后運(yùn)行時(shí)產(chǎn)生的數(shù)據(jù)和臨時(shí)數(shù)據(jù)都是需要存儲(chǔ)和保存的,所以沙箱的路徑最后能定位出來(lái),但是Bundle就沒有這樣的設(shè)置需要了。當(dāng)然這個(gè)是在模擬器中,如果在真機(jī)中應(yīng)該Bundle和沙盒路徑一旦生成都是不變的應(yīng)該(這個(gè)如果哪位大神有更好的見解,可以提出來(lái)幫助我改正):


三、選項(xiàng)1(Destination)的作用
首先由于選項(xiàng)1是可以可選可不選的,選項(xiàng)2和3是必須選一個(gè),選項(xiàng)4也是可選可不選的,那么我們先確定選項(xiàng)1的作用。
選項(xiàng)1:Destination : Copy items if needed
根據(jù)多次拖拽后發(fā)現(xiàn)這個(gè)選項(xiàng)的作用僅限于是否將原文件拷貝到工程中你拖拽所在的位置,如果勾選那么會(huì)將原文件拷貝一份到工程目錄中你拖拽的相應(yīng)位置,如果選擇不勾選,那么就不會(huì)拷貝一份到工程目錄中,但是一定會(huì)在打開的工程中看見此文件會(huì)放在拖拽的相應(yīng)位置。此處選項(xiàng)2、3任意勾選和4勾不勾選都不會(huì)影響1的作用,因?yàn)?只是拷貝文件到工程目錄底下,所以以下我們選擇24都勾選來(lái)做
- 勾選1:
原文文件(存放在桌面):

拖入工程勾選124

工程中:

工程目錄中:

- 不勾選1:
原文件不變(存放在桌面):

拖入工程我選擇24:

工程中:

工程目錄中:

PS:雖然沒有拷貝一份文件到真實(shí)的工程目錄中,但是會(huì)引用原文件,但會(huì)有一個(gè)缺陷,一旦原文件的路徑發(fā)生了改變就無(wú)法找到對(duì)應(yīng)的文件了。
四、選項(xiàng)2、3(Added folders)的作用
經(jīng)過多次的拖拽試驗(yàn)發(fā)現(xiàn):選項(xiàng)2、3對(duì)于文件來(lái)說都是一樣的效果,但是對(duì)于文件夾來(lái)說就有說法了。以下是針對(duì)于文件夾來(lái)說。選擇2還是選擇3針對(duì)于文件夾來(lái)說只會(huì)影響是否會(huì)在生成的app文件中(或者Bundle中)存在真實(shí)路徑。(另:不管2還是3都會(huì)在工程中能看見拖入的源文件或者資源文件或者文件夾)
驗(yàn)證思路:創(chuàng)建一個(gè)文件夾,文件夾中存放類源文件或者資源文件,然后將這個(gè)文件夾拖入工程中。此處1就不再驗(yàn)證了,所以勾選1不1的也就不重要了,那么我們此處默認(rèn)勾選4.
文件夾(存放在桌面上):

文件夾中內(nèi)容:

選項(xiàng)2:Create groups
不會(huì)在生成的.app文件(Bundle文件)中存在真實(shí)文件夾
勾選24:

工程中:

PS:工程目錄中是沒有的因?yàn)闆]有勾選1,不會(huì)拷貝到工程目錄中來(lái),但是如果選擇了1只要是文件夾拖入進(jìn)來(lái)之后在工程目錄中就是真實(shí)文件夾。
.app文件中:

PS:其中源文件就是會(huì)編入KODTESTTEST可執(zhí)行文件中,其他的資源文件就直接在包內(nèi)。具體如上!
選項(xiàng)3:Create folder references
會(huì)在生成的.app文件(Bundle文件)中存在真實(shí)文件夾,并且內(nèi)部存放資源文件
-
勾選34:
Snip20170519_292.png
工程中:

PS:以上中文件夾是藍(lán)色的!?。?br> PS:工程目錄中是沒有的因?yàn)闆]有勾選1,不會(huì)拷貝到工程目錄中來(lái),但是如果選擇了1只要是文件夾拖入進(jìn)來(lái)之后在工程目錄中就是真實(shí)文件夾。
.app文件中:

PS:其中源文件不會(huì)編入KODTESTTEST可執(zhí)行文件中,所有的文件都還是在此目錄下待著?。?!
PS:這也表明我們選擇34在拖入整個(gè)文件夾內(nèi)容的時(shí)候,xcode不會(huì)自動(dòng)把文件夾下的源文件放入以下的Compile sources中,而選擇24的時(shí)候就會(huì)把文件夾下的源文件放入Compile sources然后讓源文件參與編譯最終形成可執(zhí)行文件:

即便我們手動(dòng)去添加的時(shí)候也發(fā)現(xiàn)不能直接點(diǎn)開此文件夾展示子文件去選擇子文件編譯

總結(jié):所以這個(gè)3一般是我們?cè)陧?xiàng)目中作為資源文件夾來(lái)使用的,里面存放項(xiàng)目中需要使用的資源,并且我們?cè)俅瓮锩嫣砑淤Y源文件的時(shí)候是不會(huì)再次彈出勾選124的對(duì)話框,往里面拖什么就要什么!
五、選項(xiàng)4(Add to targets)的作用
經(jīng)過多次拖拽試驗(yàn),得出的結(jié)果是勾選了4之后就會(huì)在你所選擇的target最后生成的.bundle中或者.app中或者.framework中(這三者中關(guān)于選擇2\3的不同在最后給出截圖)。反之如果不勾選那么就不會(huì)存在于生成的.app/.framework/.bundle中了。
以下測(cè)試以.app為例,并且以勾選2位前提
選項(xiàng)4:Add to targets加入到某個(gè)或者多個(gè)target
PS:給大家推一篇關(guān)于Target的:iOS的多Target應(yīng)用
原文件(存放在桌面上):

- 不勾選4:

工程中:

.app中:

- 勾選4:

工程中:

.app中:

PS:綜上所述,大家應(yīng)該很清楚4只跟你運(yùn)行之后生成的.app或者.bundle/.framework等有關(guān)
說到這里大家可能會(huì)問,如果我第一次沒有勾選4怎么辦呢?那我們這里手動(dòng)教大家怎么把丟失的4給找回來(lái):
如果是源文件,我們這里選擇在Compile sources下添加相應(yīng)的文件,然后會(huì)編入.app的可執(zhí)行文件中:




如果是資源文件,我們這里選擇在Copy Bundle Resources下添加相應(yīng)的資源文件,然后會(huì)存放在包中:




六、總結(jié)
- 選項(xiàng)1的作用是將原文件拷貝到工程目錄下,如果不勾選1那么就不會(huì)拷貝,但是依然會(huì)引用原文件。一旦原文件的文件的路勁改變了,那么工程就會(huì)找不到該文件。
- 選項(xiàng)2/3的作用對(duì)于文件來(lái)說無(wú)所謂,但是對(duì)于文件夾來(lái)說就有區(qū)別了。如果是文件夾勾選了2的話那么不會(huì)在生成的.app或者.bundle或者.framework中有對(duì)應(yīng)的文件夾,并且原文件夾下的源文件會(huì)參與編譯(當(dāng)然這個(gè)是勾選了4的情況下或者Compile sources)生成可執(zhí)行文件,原文件夾下的資源文件包括圖片、plist文件或者其他資源文件會(huì)放在生成的.app或者.bundle或者.framework中對(duì)應(yīng)位置(當(dāng)然勾選了4,或者手動(dòng)添加了Copy Bundle Resources),具體位置我會(huì)在文末結(jié)束的時(shí)候都給大家貼出。
- 選項(xiàng)4的作用是添加到對(duì)應(yīng)的Targget,那么就決定了這個(gè)導(dǎo)入的文件或者文件夾會(huì)不會(huì)存在.app或者.bundle或者.framework中中。
七、文末擴(kuò)展一
擴(kuò)展一:針對(duì)于不同的Target存放的文件和文件夾存放的路徑,看以下文件會(huì)存放在哪兒:
-
.app
Snip20170519_317.png

- .bundle
PS:這里貼一下Bundle的創(chuàng)建iOS之Bundle的創(chuàng)建和使用
Snip20170519_320.png
運(yùn)行后右鍵show in finder:

右鍵顯示包內(nèi)容:

存放在Resource底下的:

- .framework
PS:這里貼一下靜態(tài)庫(kù)Framework的創(chuàng)建iOS之靜態(tài)庫(kù)Framework的創(chuàng)建

運(yùn)行后show in finder:


八、文末擴(kuò)展二
擴(kuò)展二:刪除文件或者文件夾的時(shí)候,會(huì)出現(xiàn)一個(gè)對(duì)話框,如下圖,那么我們?cè)撨x擇哪一個(gè)呢?

Xcode9 Beta拖動(dòng)文件更新注意點(diǎn)
注意了,我們?nèi)绻?jí)到Xcode9 Beta版本后,再將別處的文件直接拖入到工程中后,默認(rèn)引用的是原文件路徑,所以如果我們把原文件給刪除掉之后就會(huì)出現(xiàn)文件找不到的錯(cuò)誤,所以我們應(yīng)該按以下方式解決
- 首先將文件拷貝至工程目錄需要放置的位置
- 采用如下截圖的方式添加文件或者將剛剛拷貝到工程目錄下的文件拖入到工程中即可。

以上!



