號外!?。?br> 文末有關于xcode9 Beta拖動文件的更新注意點
一、選項認識
我們在做項目的時候時常會遇見需要導入一些類文件和資源文件之類的,當我們往項目中拖入這些文件的時候就會出現一些選項,這個時常會讓我魂牽夢繞,有時候就因為這個問題搞了老半天,所以現在準備好好的跟大家聊一聊這幾個選項。首先我們看看有哪幾個選項,請看以下截圖:
那這個就是我們經常遇見的了,我們在下文中按照順序把這幾個選項說成1234選項,如果說勾選124選項那么就是下圖中第一個和第二個和第四個選項選中了,具體請看勾選了124的下圖:
各選項
- 選項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 "......"這種方式其實也是一樣的,也能夠出現以上的這四個選項:
那怎么把這四個選項弄出來呢,通過以下這種方式,點擊options:
二、獲取路徑
要說這四個選項就要說到幾個文件路徑了
- 項目工程路徑:
- 原文件所處路徑:這個我都是放在桌面上,所有以下會用到的原文件的路徑都在桌面上,并且我已經分了類,有圖片資源和其他類型的資源文件(此處為數據庫文件),有源文件,有文件夾,如下圖:
- 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
右鍵顯示包內容:
PS:注意這個Bundle路徑每次運行之后都會變的,先把原來生成的文件夾刪除掉然后再新建一個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一樣的效果,但是沙箱最后能定位到改變之后的位置,這個很奇怪,Bundle路徑是不可以的,我感覺Bundle每次運行之后因為里面的內容變了就是變了,但是沙箱的是程序運行的路徑,所以每次運行之后運行時產生的數據和臨時數據都是需要存儲和保存的,所以沙箱的路徑最后能定位出來,但是Bundle就沒有這樣的設置需要了。當然這個是在模擬器中,如果在真機中應該Bundle和沙盒路徑一旦生成都是不變的應該(這個如果哪位大神有更好的見解,可以提出來幫助我改正):
三、選項1(Destination)的作用
首先由于選項1是可以可選可不選的,選項2和3是必須選一個,選項4也是可選可不選的,那么我們先確定選項1的作用。
選項1:Destination : Copy items if needed
根據多次拖拽后發現這個選項的作用僅限于是否將原文件拷貝到工程中你拖拽所在的位置,如果勾選那么會將原文件拷貝一份到工程目錄中你拖拽的相應位置,如果選擇不勾選,那么就不會拷貝一份到工程目錄中,但是一定會在打開的工程中看見此文件會放在拖拽的相應位置。此處選項2、3任意勾選和4勾不勾選都不會影響1的作用,因為1只是拷貝文件到工程目錄底下,所以以下我們選擇24都勾選來做
- 勾選1:
原文文件(存放在桌面):
拖入工程勾選124
工程中:
工程目錄中:
- 不勾選1:
原文件不變(存放在桌面):
拖入工程我選擇24:
工程中:
工程目錄中:
PS:雖然沒有拷貝一份文件到真實的工程目錄中,但是會引用原文件,但會有一個缺陷,一旦原文件的路徑發生了改變就無法找到對應的文件了。
四、選項2、3(Added folders)的作用
經過多次的拖拽試驗發現:選項2、3對于文件來說都是一樣的效果,但是對于文件夾來說就有說法了。以下是針對于文件夾來說。選擇2還是選擇3針對于文件夾來說只會影響是否會在生成的app文件中(或者Bundle中)存在真實路徑。(另:不管2還是3都會在工程中能看見拖入的源文件或者資源文件或者文件夾)
驗證思路:創建一個文件夾,文件夾中存放類源文件或者資源文件,然后將這個文件夾拖入工程中。此處1就不再驗證了,所以勾選1不1的也就不重要了,那么我們此處默認勾選4.
文件夾(存放在桌面上):
文件夾中內容:
選項2:Create groups
不會在生成的.app文件(Bundle文件)中存在真實文件夾
勾選24:
工程中:
PS:工程目錄中是沒有的因為沒有勾選1,不會拷貝到工程目錄中來,但是如果選擇了1只要是文件夾拖入進來之后在工程目錄中就是真實文件夾。
.app文件中:
PS:其中源文件就是會編入KODTESTTEST可執行文件中,其他的資源文件就直接在包內。具體如上!
選項3:Create folder references
會在生成的.app文件(Bundle文件)中存在真實文件夾,并且內部存放資源文件
-
勾選34:
Snip20170519_292.png
工程中:
PS:以上中文件夾是藍色的!??!
PS:工程目錄中是沒有的因為沒有勾選1,不會拷貝到工程目錄中來,但是如果選擇了1只要是文件夾拖入進來之后在工程目錄中就是真實文件夾。
.app文件中:
PS:其中源文件不會編入KODTESTTEST可執行文件中,所有的文件都還是在此目錄下待著!?。?br> PS:這也表明我們選擇34在拖入整個文件夾內容的時候,xcode不會自動把文件夾下的源文件放入以下的Compile sources中,而選擇24的時候就會把文件夾下的源文件放入Compile sources然后讓源文件參與編譯最終形成可執行文件:
即便我們手動去添加的時候也發現不能直接點開此文件夾展示子文件去選擇子文件編譯
總結:所以這個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應用
原文件(存放在桌面上):
- 不勾選4:
工程中:
.app中:
- 勾選4:
工程中:
.app中:
PS:綜上所述,大家應該很清楚4只跟你運行之后生成的.app或者.bundle/.framework等有關
說到這里大家可能會問,如果我第一次沒有勾選4怎么辦呢?那我們這里手動教大家怎么把丟失的4給找回來:
如果是源文件,我們這里選擇在Compile sources下添加相應的文件,然后會編入.app的可執行文件中:
如果是資源文件,我們這里選擇在Copy Bundle Resources下添加相應的資源文件,然后會存放在包中:
六、總結
- 選項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
- .bundle
PS:這里貼一下Bundle的創建iOS之Bundle的創建和使用
Snip20170519_320.png
運行后右鍵show in finder:
右鍵顯示包內容:
存放在Resource底下的:
- .framework
PS:這里貼一下靜態庫Framework的創建iOS之靜態庫Framework的創建
運行后show in finder:
八、文末擴展二
擴展二:刪除文件或者文件夾的時候,會出現一個對話框,如下圖,那么我們該選擇哪一個呢?
Xcode9 Beta拖動文件更新注意點
注意了,我們如果升級到Xcode9 Beta版本后,再將別處的文件直接拖入到工程中后,默認引用的是原文件路徑,所以如果我們把原文件給刪除掉之后就會出現文件找不到的錯誤,所以我們應該按以下方式解決
- 首先將文件拷貝至工程目錄需要放置的位置
- 采用如下截圖的方式添加文件或者將剛剛拷貝到工程目錄下的文件拖入到工程中即可。
以上!