检查运行时是否存在UI_USER_INTERFACE_IDIOM

时间:2010-04-16 15:53:01

标签: iphone objective-c ipad function-pointers backwards-compatibility

我正在开发一款能够在iPad和iPhone上运行的通用应用。 Apple iPad文档说使用UI_USER_INTERFACE_IDIOM()来检查我是否在iPad或iPhone上运行,但我们的iPhone是3.1.2并且不会定义UI_USER_INTERFACE_IDIOM()。因此,此代码中断了:

//iPhone should not be flipped upside down. iPad can have any
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  return YES; //are we on an iPad?
 } else {
  return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown;
 }
}

在Apple的SDK Compatibility Guide中,他们建议执行以下操作来检查函数是否存在:

//iPhone should not be flipped upside down. iPad can have any
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 if(UI_USER_INTERFACE_IDIOM() != NULL &&
  UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  return YES; //are we on an iPad?
 } else {
  return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown;
 }
}

这样可行,但会导致编译器警告:“指针和整数之间的比较。”在挖掘之后,我发现我可以使编译器警告消失,并使用以下强制转换为(void *)

//iPhone should not be flipped upside down. iPad can have any
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 if((void *)UI_USER_INTERFACE_IDIOM() != NULL &&
  UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  return YES; //are we on an iPad?
 } else {
  return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown;
 }
}

我的问题是:这里的最后一个代码块是否正常/可接受/标准练习?我无法通过快速搜索找到其他任何人做这样的事情,这让我想知道我是否错过了陷阱或类似的东西。

感谢。

1 个答案:

答案 0 :(得分:6)

您需要针对3.2 SDK构建适用于iPad的应用。因此它将正确构建,UI_USER_INTERFACE_IDIOM()宏仍然可以工作。如果你想知道如何/为什么,请在文档中查找 - 它是一个#define,编译器将理解它并编译成可在3.1(等)上正确运行的代码。