iOS之文件拖入項目中的多個選項區別

號外!?。?br> 文末有關于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可執行文件中,所有的文件都還是在此目錄下待著!?。?br> 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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容