找不到符号:_OBJC_CLASS _ $ _ UIPopoverController

Pau*_*len 16 iphone iphone-sdk-3.1 ipad uipopovercontroller

我的通用应用程序出了问题.我已将Base SDK设置为iPhone 3.2并将目标设置为3.1.

我已将使用UIPopoverController的文件移动到他们自己的文件中,并且在iPhone上加载应用程序时不应加载它们.不过,当我构建我的应用程序时,我在构建和调试到我的设备时出现以下错误:

dyld:未找到符号:_OBJC_CLASS _ $ _ UIPopoverController参考自:/var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes预期:/System/Library/Frameworks/UIKit.framework/UIKit in /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes

我真的希望有人可以帮助我.

最诚挚的问候,Paul Peelen

ken*_*ytm 27

即使它们没有在运行时加载,这些文件仍然在链接中处理._OBJC_CLASS_$_UIPopoverController因此,该符号会作为需要动态链接的符号之一添加到您的应用中.

有2个解决方法,

  1. [UIPopoverController alloc]NSClassFromString(@"UIPopoverController"),替换消息中的UIPopoverController的所有外观(例如)
  2. 使UIKit弱联系.

  • @Paul:要使库弱链接,请选择目标,打开"信息",然后将类型从"必需"更改为"弱". (7认同)
  • @Andy:可能会隐藏某些链接时错误,导致应用程序在运行时崩溃. (3认同)

AWr*_*tIV 5

我强烈建议你不要弱链接 UIKit。正如 KennyTM 和我在评论中提到的,这可能会隐藏未来的链接器问题并导致崩溃。我也不愿意告诉链接器 UIKit 是可选的,而它显然不是。大黑客。

相反,使用 NSClassFromString 间接初始化和调用 UIPopoverController:

Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    self.myPopover = [[popover alloc] initWithContentViewController:myContent];
}
Run Code Online (Sandbox Code Playgroud)

如果你仍然有链接器错误,你可能需要使用 NSSelectorFromString 调用 UIPopoverController 的消息:

Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    SEL myInit = NSSelectorFromString(@"initWithContentViewController:");
    self.myPopover = [[popover alloc] performSelector:myInit withObject:myContent];
}
Run Code Online (Sandbox Code Playgroud)

为了可移植性,我建议编写一个代理对象来处理这些实现细节。