17

我的通用应用程序有问题。我已将 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 中/var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes

我真的希望有人能帮助我。

最好的问候,保罗·皮伦

4

2 回答 2

27

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

有2个解决方法,

  1. [UIPopoverController alloc]将消息(例如)中 UIPopoverController 的所有外观替换为NSClassFromString(@"UIPopoverController"),
  2. 使 UIKit 弱链接。
于 2010-06-09T09:17:47.240 回答
5

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

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

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

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

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

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

于 2011-10-20T07:19:05.573 回答