5

我正在制作一个通用的 iPad/iPhone 应用程序,它可以使用 iPad 的 VGA 输出连接器将应用程序的内容镜像到外部屏幕上。但是,iPhone 没有此功能。给出以下代码,

#ifdef UI_USER_INTERFACE_IDIOM  
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    NSLog(@"this code should not execute on iphone");
[[NSNotificationCenter defaultCenter] addObserver:self
         selector:@selector(screenInfoNotificationReceieved:) 
          name:UIScreenDidConnectNotification
           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
         selector:@selector(screenInfoNotificationReceieved:) 
          name:UIScreenDidDisconnectNotification
           object:nil];
}
#endif

我在启动时在手机上收到此错误(在 ipad 中工作正常)“dyld:找不到符号:_UIScreenDidConnectNotification”

大概是因为 UIScreenDidConnectNotification 在 3.13 中还不存在。我如何在运行时检查这个?

更新 添加了 ifdef 语句来检查 ipad 接口,但得到相同的结果!

UPDATED添加了 NSLog 语句以确保 if 语句中的代码没有被调用。崩溃似乎发生在执行任何其他代码之前......

4

4 回答 4

3

试试弱链接 UIKit。添加到您的其他链接标志中:

-all_load -ObjC -weak_framework UIKit

如果你的目标是 3.1 之前的设备,但引用了一个只存在于 3.2 中的类,你不能用符号来引用它们,你必须使用 NSClassFromString。但是在某些情况下这是不可能的,例如,如果您将此类子类化(例如 UIPopoverController)。在这些情况下,您必须弱链接 UIKit。当你弱链接一个框架时,动态加载器会在启动时尝试解析所有符号,如果失败,它会被设置为 NULL。

我猜常量 UIScreenDidConnectNotification 没有被标记(错误),所以你需要使用相同的解决方法。

弱链接有一个缺点。由于它必须在启动时执行此操作,因此动态地启动时间会受到影响。你必须测试它是否对你来说太慢了。

弱链接框架的另一种方法是:在目标上执行“获取信息”,在“常规”选项卡下,您将看到框架列表。将 UIKit 的类型更改为弱。

顺便说一句,使用 #ifdef 来检查是行不通的,因为 #ifdef 是编译时构造,所以 UI_USER_INTERFACE_IDIOM 将始终被定义,因为您正在使用 3.2 SDK 构建

于 2010-04-28T08:23:03.793 回答
1

从 Elfred 对相关问题的回答:如何在创建 iPhone 通用二进制文件时测试常量的存在

if (NULL != &UIBackgroundTaskInvalid) {
   //do multitasking stuff here
} else {
   // don't do multitasking stuff here.
}
于 2011-02-25T19:04:25.027 回答
0

遵循http://iphonedevelopment.blogspot.com/2010/04/converting-iphone-apps-to-universal.html上的“以编程方式确定设备”部分

#ifndef __IPHONE_3_2 // if iPhoneOS is 3.2 or greater then __IPHONE_3_2 will be defined
  typedef enum { // provided by noblemaster ]:-|
    UIUserInterfaceIdiomPhone, // iPhone and iPod touch style UI
    UIUserInterfaceIdiomPad, // iPad style UI
  } UIUserInterfaceIdiom;
  #define UI_USER_INTERFACE_IDIOM() (([[UIDevice currentDevice].model rangeOfString:@"iPad"].location != NSNotFound) ? UIUserInterfaceIdiomPad : UIUserInterfaceIdiomPhone)
#endif // ifndef __IPHONE_3_2 

在评论部分。

于 2010-04-28T03:58:28.560 回答
0

弱链接框架的另一种方法是:在目标上执行“获取信息”,在“常规”选项卡下,您将看到框架列表。将 UIKit 的类型更改为弱。

这对我来说适用于运行时 iPhone 上的“找不到符号:_UIScreenDidConnectNotification”问题。

于 2010-06-10T02:46:03.960 回答