在iPhone模拟器上运行时检测到UIPopoverController类可用性的问题

时间:2011-09-18 09:59:30

标签: objective-c ios-simulator ios4 weak-linking

我在使用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")以上会导致同样的崩溃。

有人知道如何在模拟器上运行时使这些条件检查有效吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-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
    }
}