2013-08-06 46 views
4

我需要做一个定义,但如果我使用iPad或iPhone,在这种情况下我需要不同的值。如何使用define宏iOS

所以,我想应该是这样的:

#ifdef UI_USER_INTERFACE_IDIOM == iPAD 
#define ROWCOUNT 12 
#else 
#define ROWCOUNT 5 
#endif 

有一些解决办法得到它?

+0

使用可变的rowCount而不是 – AlexWien

+0

请参阅http://stackoverflow.com/questions/2576356/how-doe s-one-get-ui-user-interface-idiom-to-work-with-iphone-os-sdk-3-2 – usr2564301

回答

7

#ifdef并没有真正做你想要的这里。

一个很好的解决办法是:

#define ROWCOUNT ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) ? 5 : 12) 
+2

小修改建议 - 确保将整个表达式放在()中。否则,像if(ROWCOUNT == 5)这样的语句将被错误地解释。 – sbaker

+1

你是完全正确的。改变。^_^ –

+0

是的,我刚刚看到警告并立即添加()。 Xcode非常聪明) –

7

UI_USER_INTERFACE_IDIOM为展开至一些表达,在编译时运行时检查硬件的类型,而不是一个宏。因此,您想要将您的ROWCOUNT的定义更改为变量而不是常量或宏。

NSUInteger rowCount; 
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    rowCount = 12; 
else 
    rowCount = 5; 

或更简洁:

NSUInteger rowCount = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? 12 : 5; 
5

这种方法正确识别UI_USER_INTERFACE_IDIOM的可用性:

#ifdef UI_USER_INTERFACE_IDIOM 
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
#else 
#define IS_IPAD false 
#endif 

#define ROWCOUNT (IS_IPAD ? 12: 5) 

您也可以使用IS_IPAD宏如下:

NSUInteger rowCount; 
if (IS_IPAD){ 
    rowCount = 12; 
}else{ 
    rowCount = 5; 
}