0

我在一个通用应用程序上工作,它使用 UIPopoverController 的 iPad 版本。(基础 SDK 和部署目标都是 iOS 4.3)

当我使用 iPhone 模拟器(4.3 版)测试 iPad 和 iPhone 的条件代码路径时,弱链接和NSClassFromString(@"UIPopoverController")方法都没有给出预期的行为。

在测试 UIKit 框架的弱链接时,我确保使用 LLVM 2.1 编译器并在“Target->Build Phases->Link Binary with Libraries”中将 UIKit 框架设为“可选”。(据我了解是在 Xcode 4.1 中执行此操作的方法)。

运行代码

if ([UIPopoverController class]) { 
...
_popover = [[UIPopoverController alloc] initWithContentViewController:controller];
...
}

iPhone 模拟器上的应用程序崩溃,表明[UIPopoverController class]不返回nil. [UIPopoverController class]用上面的替换NSClassFromString(@"UIPopoverController"),会导致同样的崩溃。

有谁知道在模拟器上运行时如何使这些条件检查工作?

4

2 回答 2

0

UIPopoverController 类作为 iOS 3.2 版本的一部分存在,因此它不应该在任何具有 iOS 4.x 版本甚至 iPhone 的设备上返回 nil,只有具有 iOS 3.1.3 及以下版本的 iPhone 会通过弱(可选)链接获得 nil。要确定您是否可以使用此类,您可以尝试使用 userInterfaceIdiom 建议的上述解决方案。

于 2011-10-06T20:39:03.883 回答
-2

尝试确定代码是否在 iPad 上运行。
如果是这样,您可以安全地使用UIPopoverController.

- (BOOL)isPad
{
    if ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)])
    {
        return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad);
    }
    else
    {
        return NO; // all iPad OS's implement -userInterfaceIdiom
    }
}
于 2011-09-18T10:13:34.970 回答