2010-01-12 23 views
2

我想在我的項目中有一個常量,以在Lite和Pro版本之間進行更改。我不認爲這是做的最好的方式,但我想:iPhone項目常量

  1. 添加恆定在我的應用程序委託

    #define BUILD_PRO 1 //0 => LITE, 1 => PRO 
    
  2. ,當我需要它,我導入的appDelegate並對其進行測試:

    #import "myAppDelegate.h" 
    

    後來

    #if (BUILD_PRO==1) 
    NSLog(@"this is pro version"); 
    #endif 
    

問題是這段代碼在某些文件中有效,而在其他文件中不起作用。我沒有發現這種行爲的任何解釋;有人有解釋嗎?

什麼是從同一個項目有兩個版本(專業版和精簡版)的正確方法?

+1

是的,這是正確的地方。 – 2010-01-12 22:36:18

+0

這可能與需要重建的預編譯頭文件有關,但我不會使用頭文件。使用建立的目標...看到下面得票最多的答案。 – Nimrod 2010-01-12 23:11:12

回答

7

沒錯。預處理器定義是實現它的方法。

我想它是在一些文件中工作,而不是其他人,因爲有些可能不包括您的myAppDelegate.h文件,因此沒有得到定義。我建議定義一個「精簡版」和「專業版」目標,並在每個目標的構建配置中設置預處理器變量。

一旦你創建了一個精簡版的目標(只需選擇你的「專業版」目標的重複的目標上下文菜單項創建精簡版之一):

  • 走進項目/編輯目標「專業版「菜單項
  • 轉到生成選項卡並找到預處理部分(朝下)。
  • 將BUILD_PRO = 1添加到「預處理宏」部分。

這樣你不必更改任何頭文件,你只需要構建精簡或完整的目標。如果你需要在你的產品中任何地方增加親功能,只需使用:

#ifdef BUILD_PRO 
// do some pro stuff 
#endif 
+0

+1這是最好的答案,因爲它是在構建配置中定義的,這是Xcode等同於在Makefile中執行的構造配置,這就是使用'make'正確完成配置的方式。請注意,人們通常只是使用「#define FOO」,然後是「#ifdef FOO」...「#endif」而不是「#define FOO 1」和「#if(FOO == 1)」,儘管在邏輯上它應該「沒關係。 – Nimrod 2010-01-12 23:10:13

+0

謝謝,很好的回答 但我沒有找到「預處理宏」部分 我正在關注本教程http://just2us.com/2009/07/tutorial-creating-multiple-targets-for-xcode-iphone-項目/ 我已經把「所有配置」,並選擇了基礎SDK,如教程中提到的,但我沒有看到「預處理宏」部分 我看到的只是「Info.plist其他預處理器標誌」,「 Info.plist預處理器定義「,」Info.plist預處理器前綴文件「 (我正在使用\t iphone_sdk 3.1.2與xcode 3.1.4) – AmineG 2010-01-13 08:43:44

+0

沒關係 我發現問題:我必須選擇設備,而不是模擬器找到宏預處理器部分 現在它的worik完美 – AmineG 2010-01-13 11:14:08

2

這樣做的一種方法是爲pro版本和light版本的目標設定一個目標。然後你在pro版本的預處理器宏下的構建設置中聲明你的常量。

然後在你的代碼,你可以這樣做:

#ifdef BUILD_PRO 
    //super awesome pro code here. 
#endif 
0

我AppDelegate.m的頭部聲明一個變量:

int DEVICE_TYPE; 

然後在的applicationDidFinishLaunching在我的AppDelegate,我打電話:

- (void) setDeviceType { 

    NSString* machineType = [[UIDevice currentDevice] machine]; 
    if ([[[UIDevice currentDevice] model] isEqualToString:@"iPod touch"]) { 
    DEVICE_TYPE = IPOD_TOUCH; 
    } else if ([machineType isEqualToString:@"iPhone1,2"] || 
      [machineType isEqualToString:@"iPhone1,1"]) { 
    DEVICE_TYPE = IPHONE3G; 
    } else { 
    DEVICE_TYPE = IPHONE3GS; 
    } 
}