iOS之檔案拖入專案中的多個選項區別

weixin_33860722發表於2017-05-18

號外!!!
文末有關於xcode9 Beta拖動檔案的更新注意點

一、選項認識

我們在做專案的時候時常會遇見需要匯入一些類檔案和資原始檔之類的,當我們往專案中拖入這些檔案的時候就會出現一些選項,這個時常會讓我魂牽夢繞,有時候就因為這個問題搞了老半天,所以現在準備好好的跟大家聊一聊這幾個選項。首先我們看看有哪幾個選項,請看以下截圖:

5293487-1cb3b20f9efc6cd3.png
Snip20170518_242.png

那這個就是我們經常遇見的了,我們在下文中按照順序把這幾個選項說成1234選項,如果說勾選124選項那麼就是下圖中第一個和第二個和第四個選項選中了,具體請看勾選了124的下圖:

5293487-7d1021872497c592.png
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 "......"這種方式其實也是一樣的,也能夠出現以上的這四個選項:

5293487-3673e355ee13524e.png
Snip20170703_124.png

那怎麼把這四個選項弄出來呢,通過以下這種方式,點選options:


5293487-d023893e72cabc09.png
Snip20170703_125.png
5293487-6068d8fff797de63.png
Snip20170703_126.png
二、獲取路徑

要說這四個選項就要說到幾個檔案路徑了

  • 專案工程路徑:
5293487-10bf4aed17a28b8e.png
Snip20170519_265.png
  • 原檔案所處路徑:這個我都是放在桌面上,所有以下會用到的原檔案的路徑都在桌面上,並且我已經分了類,有圖片資源和其他型別的資原始檔(此處為資料庫檔案),有原始檔,有資料夾,如下圖:
5293487-dc4b2d147fa645d1.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
5293487-6bf764f039408752.png
Snip20170519_259.png

右鍵顯示包內容:


5293487-5ae729c50a0f9d6d.png
Snip20170519_262.png
5293487-5fbefeedf493de8e.png
Snip20170519_264.png

PS:注意這個Bundle路徑每次執行之後都會變的,先把原來生成的資料夾刪除掉然後再新建一個Bundle路徑:

5293487-4bd1b31d5d3428e4.gif
BundlePath.gif

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

5293487-53d1b409415bdeae.png
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和沙盒路徑一旦生成都是不變的應該(這個如果哪位大神有更好的見解,可以提出來幫助我改正):

5293487-83606ac00780c49c.png
Snip20170519_266.png
5293487-d47f05b7d62595b0.gif
Sandbox.gif
三、選項1(Destination)的作用

首先由於選項1是可以可選可不選的,選項2和3是必須選一個,選項4也是可選可不選的,那麼我們先確定選項1的作用。

選項1:Destination : Copy items if needed

根據多次拖拽後發現這個選項的作用僅限於是否將原檔案拷貝到工程中你拖拽所在的位置,如果勾選那麼會將原檔案拷貝一份到工程目錄中你拖拽的相應位置,如果選擇不勾選,那麼就不會拷貝一份到工程目錄中,但是一定會在開啟的工程中看見此檔案會放在拖拽的相應位置。此處選項2、3任意勾選和4勾不勾選都不會影響1的作用,因為1只是拷貝檔案到工程目錄底下,所以以下我們選擇24都勾選來做

  • 勾選1:
    原文檔案(存放在桌面):
5293487-2ecaaafbc3d5e118.png
Snip20170519_271.png

拖入工程勾選124


5293487-14a66532988f56c0.png
Snip20170519_269.png

工程中:

5293487-377faabf2b880310.png
Snip20170519_270.png

工程目錄中:

5293487-38d36600ed49419b.png
Snip20170519_272.png
  • 不勾選1:
    原檔案不變(存放在桌面):
5293487-e7d2dbccb6580fdf.png
Snip20170519_271.png

拖入工程我選擇24:

5293487-b51b6d382ffa111d.png
Snip20170519_274.png

工程中:

5293487-0613f3c37b22338c.png
Snip20170519_275.png

工程目錄中:

5293487-f4e00b791ada56f9.png
Snip20170519_277.png

PS:雖然沒有拷貝一份檔案到真實的工程目錄中,但是會引用原檔案,但會有一個缺陷,一旦原檔案的路徑發生了改變就無法找到對應的檔案了。

四、選項2、3(Added folders)的作用

經過多次的拖拽試驗發現:選項2、3對於檔案來說都是一樣的效果,但是對於資料夾來說就有說法了。以下是針對於資料夾來說。選擇2還是選擇3針對於資料夾來說只會影響是否會在生成的app檔案中(或者Bundle中)存在真實路徑。(另:不管2還是3都會在工程中能看見拖入的原始檔或者資原始檔或者資料夾)
驗證思路:建立一個資料夾,資料夾中存放類原始檔或者資原始檔,然後將這個資料夾拖入工程中。此處1就不再驗證了,所以勾選1不1的也就不重要了,那麼我們此處預設勾選4.
資料夾(存放在桌面上):

5293487-00ffc972b5bba067.png
Snip20170519_287.png

資料夾中內容:

5293487-1125c937d7739b0b.png
Snip20170519_286.png

選項2:Create groups
不會在生成的.app檔案(Bundle檔案)中存在真實資料夾

勾選24:


5293487-83bf7bbe061ab1ed.png
Snip20170519_288.png

工程中:

5293487-524beb67c499ed1b.png
Snip20170519_293.png

PS:工程目錄中是沒有的因為沒有勾選1,不會拷貝到工程目錄中來,但是如果選擇了1只要是資料夾拖入進來之後在工程目錄中就是真實資料夾。

.app檔案中:

5293487-e90358f175ff1e42.png
Snip20170519_291.png

PS:其中原始檔就是會編入KODTESTTEST可執行檔案中,其他的資原始檔就直接在包內。具體如上!

選項3:Create folder references
會在生成的.app檔案(Bundle檔案)中存在真實資料夾,並且內部存放資原始檔

  • 勾選34:


    5293487-f560d7319be87ef7.png
    Snip20170519_292.png

工程中:

5293487-19f514b5a70aafcd.png
Snip20170519_294.png

PS:以上中資料夾是藍色的!!!
PS:工程目錄中是沒有的因為沒有勾選1,不會拷貝到工程目錄中來,但是如果選擇了1只要是資料夾拖入進來之後在工程目錄中就是真實資料夾。

.app檔案中:

5293487-b20a98453593c33d.png
Snip20170519_295.png

PS:其中原始檔不會編入KODTESTTEST可執行檔案中,所有的檔案都還是在此目錄下待著!!!
PS:這也表明我們選擇34在拖入整個資料夾內容的時候,xcode不會自動把資料夾下的原始檔放入以下的Compile sources中,而選擇24的時候就會把資料夾下的原始檔放入Compile sources然後讓原始檔參與編譯最終形成可執行檔案:

5293487-ba48f1f1f653ebff.png
Snip20170519_296.png

即便我們手動去新增的時候也發現不能直接點開此資料夾展示子檔案去選擇子檔案編譯


5293487-d4a226d8bba230b2.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應用
原檔案(存放在桌面上):

5293487-1f09ef34d73e2bf5.png
Snip20170519_298.png
  • 不勾選4:
5293487-21295018f901d740.png
Snip20170519_300.png

工程中:

5293487-87d246df5d985ec5.png
Snip20170519_301.png

.app中:

5293487-851c46bf0f36611e.png
Snip20170519_302.png
  • 勾選4:
5293487-1d0dc65ad840588b.png
Snip20170519_304.png

工程中:

5293487-e3c0012409b3f68b.png
Snip20170519_305.png

.app中:

5293487-34adfc44e96b9451.png
Snip20170519_306.png

PS:綜上所述,大家應該很清楚4只跟你執行之後生成的.app或者.bundle/.framework等有關

說到這裡大家可能會問,如果我第一次沒有勾選4怎麼辦呢?那我們這裡手動教大家怎麼把丟失的4給找回來:
如果是原始檔,我們這裡選擇在Compile sources下新增相應的檔案,然後會編入.app的可執行檔案中:

5293487-fcc3a38aed8bb317.png
Snip20170519_307.png
5293487-3e770bec9cb8557f.png
Snip20170519_308.png
5293487-720d883290987640.png
Snip20170519_309.png
5293487-7b5327241892f443.png
Snip20170519_310.png

如果是資原始檔,我們這裡選擇在Copy Bundle Resources下新增相應的資原始檔,然後會存放在包中:

5293487-46af4805fd8eb566.png
Snip20170519_311.png
5293487-b889652713488c44.png
Snip20170519_312.png
5293487-639236c96251b81b.png
Snip20170519_313.png
5293487-192826e5bab7c0a9.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


    5293487-ae72d4ea38fd7be7.png
    Snip20170519_317.png
5293487-7c18d6fa10ec6428.png
Snip20170519_315.png
5293487-da0f92dd9d115a2d.png
Snip20170519_323.png

右鍵顯示包內容:

5293487-5184906e1fb0027f.png
Snip20170519_326.png

存放在Resource底下的:

5293487-0b1af72d43110067.png
Snip20170519_328.png
5293487-ba94c31d4246117d.png
Snip20170519_330.png

執行後show in finder:

5293487-c4c6e02325e30b5b.png
Snip20170519_329.png
5293487-c9e218128622a5dd.png
Snip20170519_331.png
八、文末擴充套件二

擴充套件二:刪除檔案或者資料夾的時候,會出現一個對話方塊,如下圖,那麼我們該選擇哪一個呢?

5293487-7d917dfe15c426fc.png
Snip20170519_332.png

Xcode9 Beta拖動檔案更新注意點

注意了,我們如果升級到Xcode9 Beta版本後,再將別處的檔案直接拖入到工程中後,預設引用的是原檔案路徑,所以如果我們把原檔案給刪除掉之後就會出現檔案找不到的錯誤,所以我們應該按以下方式解決

  • 首先將檔案拷貝至工程目錄需要放置的位置
  • 採用如下截圖的方式新增檔案或者將剛剛拷貝到工程目錄下的檔案拖入到工程中即可。
5293487-825c064fe6fcb205.png
Snip20170621_6.png

以上!

5293487-222ea8c6efd0daa5.png
呆萌.png

相關文章