我已经编写了一个 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");
}

从那时起,他们使用不同的 AppDelegates,并且我检查了标头以确保 UISplitView 永远不会通过电话逻辑使用或导入。

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

有帮助吗?

解决方案

因为你没有薄弱环节UIKit框架被触发的错误。在iPhone OS 3.2 UIKit框架增加了UISplitViewController,如果你的链接它作为正常应用程序假定是在3.0,在它们不存在的符号。

要弱链接的框架,找到在Xcode应用目标,检查它,并转到常规选项卡。在该选项卡的底部应该是框架的名单,与类型的列。从所需的更改UIKit的类型,薄弱和重新构建应用程序。这应该采取的运行时错误的护理。

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

(更新:2011/12/21)随着iOS 4.2的,你应该不再需要薄弱环节框架,以防止类似的错误。如马科·阿门特描述,如果你建立与iOS 4.2或更高版本以及向下定位到iPhone OS 3.1+,个人类现在是弱连接,如果类不上的操作系统当前运行的版本存在应该有自己的+class方法的返回nil

其他提示

我有一个非常类似的错误,这是推动我疯了! :-)搜索小时,不能弄清楚...

就像你说的,在iPad模拟器运行时,但试图测试的iPhone在App与iPhone OS 3.1.2,当它甚至不会启动,但一切都很好崩溃并出现以下错误信息:

  

mi_cmd_stack_list_frames不是在堆栈足够的帧

通过检查几乎每行代码我意识到3.2类,如UIPopoverController或UISplitViewController(已经内部分叉的iPad特定代码)的所述分配是造成问题。

因此,而不是即:

  

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

我会写

  

infoPopover = [[NSClassFromString(@ “UIPopoverController”)的alloc] initWithContentViewController:infoNavController];

和解决我的问题! (调试可以这么辛苦,如果错误信息给你任何关于其中的bug可能被发现...线索)

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

对我有帮助的是:

  • 重新启动Xcode
  • 执行“产品 -> 清洁” 转移命令K
  • 重建项目
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top