Iphone iOS目标为3.1.3时未找到UINib

Iphone iOS目标为3.1.3时未找到UINib,iphone,Iphone,嗨 我正在使用SDK 4.1构建一个iPhone应用程序,并将目标操作系统设置为3.1.3。 当我在运行iOS4.1的设备上安装应用程序时。一切进展顺利。 当我尝试在运行3.1.3的设备上运行应用程序时,我得到下面的stacktrace dyld: Symbol not found: _OBJC_CLASS_$_UINib Referenced from: /var/mobile/Applications/BDD67A1E-9B40-43E7-A012-7D92036B2E24/ThisIs

嗨 我正在使用SDK 4.1构建一个iPhone应用程序,并将目标操作系统设置为3.1.3。 当我在运行iOS4.1的设备上安装应用程序时。一切进展顺利。 当我尝试在运行3.1.3的设备上运行应用程序时,我得到下面的stacktrace

dyld: Symbol not found: _OBJC_CLASS_$_UINib
  Referenced from: /var/mobile/Applications/BDD67A1E-9B40-43E7-A012-7D92036B2E24/ThisIsMy.app/ThisIsMy
Expected in: /System/Library/Frameworks/UIKit.framework/UIKit
 in /var/mobile/Applications/BDD67A1E-9B40-43E7-A012-7D92036B2E24/ThisIsMy.app/ThisIsMy
我猜这是因为UINib只是在4.0中添加到SDK中的

我想知道的是你如何缓解这个问题。我应该如何支持3.1.3


干杯。

首先,您需要将框架引用更改为。然后在调用使用类的代码之前,使用描述的技术测试类是否存在。

我强烈建议您不要弱链接UIKit。这可能会隐藏将来的链接器问题并导致崩溃。我也不愿意告诉链接器UIKit是可选的,而实际上它不是。大黑客

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

Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    self.myPopover = [[popover alloc] initWithContentViewController:myContent];
}
Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    SEL myInit = NSSelectorFromString(@"initWithContentViewController:");
    self.myPopover = [[popover alloc] performSelector:myInit withObject:myContent];
}
如果仍然存在链接器错误,则可能需要使用NSSelector FromString调用UIPopoverController的消息:

Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    self.myPopover = [[popover alloc] initWithContentViewController:myContent];
}
Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    SEL myInit = NSSelectorFromString(@"initWithContentViewController:");
    self.myPopover = [[popover alloc] performSelector:myInit withObject:myContent];
}
为了便于移植,我建议编写一个代理对象来处理这些实现细节。

Gah!阿维里蒂夫说的。(我试图删除这个答案,但没有)我没有注意到涉及的框架是UIKit。您肯定不想弱链接UIKit。