2009-02-11 49 views
11

我有一個iPhone應用程序,具有不同的皮膚風格,不同的藝術資產和聲音,但所有相同的代碼。一個筆尖,不同的資產。捆綁?

我已經設置了多個目標,但我遇到的問題是我必須有一組不同的UIBuilder nib文件,每個目標每個視圖一個,設置爲指向正確的藝術那個目標。

這是一個有點沮喪,因爲如果我做出改變,以一個筆尖的文件,我必須手動進行相同的更改,相同的連接等所有其他筆尖文件。我還將所有資產放在不同名稱的不同皮膚中,以免它們在項目中發生碰撞。所以,如果我有目標,A和B,我有a_main_menu.pngb_main_menu.png ... a_FooViewController.xibb_FooViewController.xib ......等

有沒有一種方法,使指向具有相同名稱資產筆尖文件,但在...嗯,不同的捆綁?這是一個什麼樣的捆綁包?我可以想象在我的代碼中修復類似這樣的東西(可能在加載它之前在Nib中搜索並替換A for B甚至可能足夠好),儘管我沒有嘗試過,但這很難看。

這對我的第一套應用程序來說是一個易於管理的策略(儘管遠非最佳),但隨着我的東西變得越來越複雜,它很難保持我的構建器文件同步,而且它不是一個非常乾燥的方式上班。除了放棄uibuilder並在代碼中創建視圖之外,還有更好的方法嗎?

這將是很好,如果這個工作在Xcode中/建設者的水平,所以建造者會尊重我的當前目標和展示藝術的,而我的工作是目標......不過我也許可以生活在沒有,像如果我可以在運行時選擇當前的一組藝術作品,而且我只能在製作工具中使用一組作品。我也可以用一組筆尖做一個單一的目標,並在建造之前手動替換所有的藝術品,但這也不是很好。

最重要的是,如果我可以混合使用這兩種策略 - 就像如果我有了一個視圖出來的幾個,只是必須要異地佈置一個目標......但這是可選的。

我在問正確的問題嗎?

謝謝!

回答

1

假設每個應用程序只需一次一個皮膚,要創建不同主題的多個應用程序,我會在我的源代碼管理創建一個分支,然後更換necesary資產。您使用所有默認資產保留主分支,然後將來自主服務器的代碼更改合併到您的皮膚分支中,使所有內容保持同步。

Git使這非常簡單。

0

我認爲最好的選擇是使用類似git的東西。

如果使用GIT中,可以有保持所述主源代碼和邏輯主分支,和具有具有用於應用程序的每一個特定的味道不同的數據集/圖像的子分支。在這個解決方案中,XCode甚至不知道發生了什麼。

0

我認爲這是viewDidLoad用於定製更多,在這裏你可以改變圖像路徑。要做到這一點

5

一種方法是將所有你的作品移到單獨的包和在運行時動態加載(有點像「媒體插件」)。

  • 創建一個單獨的項目並選擇「Mac OS X/Framework & Library/Bundle」。稱它爲media.bundle

  • 把你所有的作品到這個項目中。

  • 爲了讓生活方便,在您的主項目下增加一個額外的「運行腳本」一步向目標複製從構建目錄內置輸出到子文件夾。爲了使它更容易,將媒體包添加爲主項目中的相關項目,以便自動重建。

在您的主項目中,您將需要這兩種方法。您可以在一個BundleUtils類它們的靜態方法:

+ (NSString *) bundleDirectoryFor:(NSString *) bundleName 
{ 
NSString* basePath = [[[NSBundle mainBundle] resourcePath] 
    stringByAppendingPathComponent:[NSString 
           stringWithFormat:@"%@.bundle", bundleName]]; 
return [[NSBundle bundleWithPath:basePath] resourcePath]; 
} 

+ (NSString *) resourceInBundle:(NSString *)bundleName 
         fileName:(NSString *)fileName 
{ 
NSString *bundlePath = [BundleUtils bundleDirectoryFor:bundleName]; 
return [bundlePath stringByAppendingPathComponent:fileName]; 
} 

現在你想在你的包訪問藝術品每一次,你可以得到的路徑正確的文件有:

NSString* imageFile = [BundleUtils resourceInBundle:@"media.bundle" 
             fileName:@"image.jpg"]; 
UIImage* image = [UIImage imageNamed:imageFile]; 

顯然,名稱「media.bundle」可以在運行時替換爲不同的名稱,以便您可以根據應用程序的需要切換到其他包。這也是支持可下載內容的便捷方式(例如,用於付費附加組件)。

警告:這是假定你需要在運行時通過代碼動態加載圖像。但是你也有靜態的NIB文件,其中嵌入了媒體。您必須找出一種方法來使靜態NIB文件使用動態方法來解析媒體文件名稱。一種方法是使用MethodSwizzling並觀察帶有類型前綴的文件路徑,例如「media:image.png」,並重定向它們以使用BundleUtil方法。

另一種方式是與IB做你的佈局,然後使用nib2objc將其轉換爲的OBJ-C代碼,然後替換插件捆綁的機制。

希望這會有所幫助。

0

這對我有用:

1個項目。 2目標a,b。 a,b的2個圖像文件夾。

controller.m及其nib文件適用於兩個目標。

爲目標a和b的圖像創建單獨的文件系統文件夾。

導入一個圖像文件夾來定位(「添加文件到XY」 - >「添加到靶標A/B」),其他的靶B。確保您使用「爲添加的文件夾創建組」選項。不要選擇「文件夾引用」選項。

當我建立靶向,我得到一個應用程序與文件夾從一個圖像;當我建立b,它使用文件夾b的照片。