30

我已经编写了一个 iPhone 和 iPad 通用应用程序,它在 Xcode 上的 iPad 模拟器中运行良好,但我现在想测试 iPhone 的功能。我似乎无法使用此代码运行 iPhone 模拟器,因为它始终默认为 iPad?

相反,我尝试在设备上运行,当它开始运行时,我收到以下错误:

dyld: Symbol not found: _OBJC_CLASS_$_UISplitViewController
  Referenced from: /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/Test
  Expected in: /System/Library/Frameworks/UIKit.framework/UIKit in /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/TEST

由于应用程序是通过编程而不是使用 XIB 构建的,因此我在 main.m 方法中使用以下行拆分了 2 个设备逻辑:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Pad");
}
else
{
    retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Phone");
}

从那时起,他们使用不同的 AppDelegate,我检查了我的标题以确保 UISplitView 从未使用过,也不会通过 Phone 逻辑导入。

如何避免此错误,是否有更好的方法来拆分这个以编程方式创建的应用程序中的通用逻辑路径?

4

3 回答 3

66

触发该错误是因为您没有弱链接 UIKit 框架。iPhone OS 3.2 中的 UIKit 框架添加了 UISplitViewController,如果您正常链接它,您的应用程序将假定这些符号存在于 3.0 中,而它们不存在。

要弱链接框架,请在 Xcode 中找到您的应用程序目标,检查它,然后转到 General 选项卡。该选项卡的底部应该是一个框架列表,其中有一列用于类型。将 UIKit 的 Type 从 Required 更改为 Weak 并重建您的应用程序。那应该处理运行时错误。

您的条件逻辑是合理的,但我倾向于共享一个应用程序委托并进一步进行特定于接口的布局。

(更新:2011 年 12 月 21 日)从 iOS 4.2 开始,您应该不再需要弱链接框架来防止此类错误。正如Marco Arment 所描述的,如果您使用 iOS 4.2 或更高版本构建并针对 iPhone OS 3.1+,则各个类现在是弱链接,并且如果当前运行的操作系统版本上不存在该类,则应该+class返回它们的方法。nil

于 2010-04-12T12:35:05.210 回答
4

我遇到了一个非常相似的错误,这让我发疯了!:-) 搜索了几个小时,但无法弄清楚......

就像你说的,在 iPad 模拟器中运行时一切都很好,但是当尝试在 iPhone 上使用 iPhone OS 3.1.2 测试应用程序时,它甚至无法启动,而是崩溃并出现以下错误消息:

mi_cmd_stack_list_frames 堆栈中没有足够的帧

通过检查几乎每一行代码,我意识到分配诸如 UIPopoverController 或 UISplitViewController 之类的 3.2 类(已经在分叉的 iPad 特定代码中)导致了问题。

所以代替ie:

infoPopover = [[UIPopoverController alloc] initWithContentViewController: infoNavController];

我会写

infoPopover = [[NSClassFromString(@"UIPopoverController") alloc] initWithContentViewController: infoNavController];

这解决了我的问题!(如果错误消息让您不知道可能在哪里找到错误,那么调试可能会非常困难......)

于 2010-04-12T19:40:52.817 回答
0

Xcode 8.3、iPad 2(非视网膜)、Swift 3 代码

对我有帮助的是:

  • 重启 Xcode
  • 做一个“产品->清洁”ShiftCommandK
  • 重建项目
于 2017-08-17T12:15:06.340 回答