2010-01-29 67 views
13

編譯iPad時是否有一個特定的Xcode編譯器標誌被設置?是否有編譯iPad時設置的特定Xcode編譯器標誌?

我希望有條件編譯的iPad VS例如iPhone/iPod Touch的代碼:

#ifdef TARGET_IPAD 
    code for iPad 
#else 
    code for iPhone 
#endif 

我知道已經有TARGET_OS_IPHONE和TARGET_CPU_ARM在TargetConditionals.h但任何方便,專門針對iPad的?

-Rei

+0

我有相同問題。你有任何其他的解決方案做同樣的事情,在你的問題..完全相同,我想要做但顯示錯誤「符號未找到」幫助我做到這一點.. – Ayaz 2013-02-05 09:28:59

回答

16

正確的API使用的iPad與iPhone/iPad的觸摸運行時檢查是:

BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad); 

的的UIDevice頭文件管理器還包括一個方便的宏,UI_USER_INTERFACE_IDIOM(),這將是有益的,如果你的部署目標是< iPhone 3.2 。

#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone) 

所以你也可以說,負:

BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone); 
2

而不是使用編譯時間標誌的,你應該使用運行時檢查如使用NSClassFromString查看是否存在類,因爲可以在兩個設備上安裝相同的應用程序。

由於在這兩種設備上運行應用程序的可能性,因此沒有內置編譯時檢查它是否以iPad爲目標。

+1

肯尼是正確的。 Apple建議運行時檢查API和對新框架的弱連接等。 您可以使用Erica Sadun的UIDevice Extensions(http://github.com/erica/uidevice-extension)輕鬆檢查您在運行時運行的設備。 而正如肯尼所說,NSClassFromString,respondsToSelector和檢查函數名稱對NULL是你的朋友。 – Jasarien 2010-01-29 10:19:19

0

目前我沒有發現任何能讓你檢查你是否在iPad上的東西,但我也不確定蘋果是否推薦運行時檢查。以下是蘋果的摘錄:

除了視圖控制器之外,iPhone和iPad設備之間共享的任何類都需要包含條件編譯宏來隔離設備特定的代碼。雖然您也可以使用運行時檢查來確定特定的類或方法是否可用,但這樣做只會通過添加在一個設備或另一個設備上不會遵循的代碼路徑來增加可執行文件的大小。讓編譯器刪除這些代碼有助於保持代碼清潔。

但是,沒有地方可以找到關於條件編譯宏的更多特定信息。

+0

是的,我也讀過,所以我認爲會有一些#define在某個地方,但我找不到它。目前,我正在使用UIScreen尺寸來檢查iPad,但看起來並不很優雅。我會看看上面提到的UIDevice-extension。謝謝大家! -Rei – Rei 2010-01-29 20:51:51

0

對於共享相同項目/代碼的多個目標,我通過編輯iPad目標的C標誌來完成此操作。

選擇[myapp] -iPad目標作爲活動目標,選擇Project - > Edit Active Target [myapp] -iPad。搜索「c標誌」並雙擊。爲「-D TARGET_IPAD」添加一個標誌。現在符號TARGET_IPAD將只爲您的iPad目標定義。

當然,這隻適用於iPad和iPhone使用不同的目標。如果你在兩個版本上都運行相同的二進制文件,顯然編譯器無法爲你做什麼。 (然而,3.2 SDK截至1月底甚至不支持通用應用程式嗎。)

(編輯;我感到困惑的「通用」的應用程序等的術語)

+0

那麼你是說蘋果所說的神祕的通用應用程序甚至還不存在?有趣的是,如果我們需要兩個不同的版本,那麼這兩個版本就可以提交給應用商店。蘋果說這不是他們想要的。我在等着看這是怎麼發生的。 – Justin 2010-02-02 19:29:52

+0

3.REDACTED SDK的發行說明表示構建UnivREDACTEDal Apps尚不受支持。我敢打賭它即將推出。 – qwzybug 2010-02-03 19:32:59

-1

我認爲這會做

-(BOOL)isDeviceAniPad 
{ 
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200 
    return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad); 
#endif 
    return NO; 
} 
+0

只需使用'UI_USER_INTERFACE_IDIOM()' – user102008 2011-03-12 00:46:47

0

或 - >只是要確定

-(BOOL)isDeviceAniPad 
{ 
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200 
BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad); 
return deviceIsPad; 
#endif 
return NO; 
} 
+0

只需使用'UI_USER_INTERFACE_IDIOM()' – user102008 2011-03-12 00:45:55

相關問題