【发布时间】:2018-04-30 16:45:04
【问题描述】:
所以这很奇怪......我们有一个用 Obj-C 编写的应用程序,在任何人更新到 iOS 11.3 之前它运行良好。 11.3 更新打破了它......但是使用 Xcode 9.3 和新编译器,我们在任何和所有设备上都会遇到相同的错误。因此,Apple 似乎破坏了 SDK 中的某些内容。
出于同样的原因,如果他们真的破坏了 SDK 中的某些东西,那么似乎每个人都会遇到这个问题。所以我求助于你,这个智囊团,来帮助我解决这个问题!
注意:非常清楚:这是一个用 Obj-C 而不是 Swift 编写的旧应用程序,并且只进行了一段时间的维护。
因此,有问题的代码块非常简单:
- (UINavigationController *)controllerForCategories: (NSArray *)categories titled:(NSString *)title
{
DocumentViewController *dc = [[DocumentViewController alloc]initWithCategories:categories titled:title];
UINavigationController *nc = [[UINavigationController alloc]initWithRootViewController:dc];
[self addChildViewController:nc];
// ERROR HAPPENS ON THIS ^^ LINE
[nc didMoveToParentViewController:self];
[self.contentPanel addSubview:nc.view];
nc.view.frame = self.contentPanel.bounds;
return nc;
}
现在根据 Apple 文档,应该没问题。如果我们重写了 addChildViewController() ,那么我们可能会遇到问题,但我们没有,我们只是在调用该方法。名为“nc”的参数是扩展 UIViewController 的 SDK 类,因此它是相关方法的有效参数。但是,在 11.3(或在所有带有 Xcode 9.3 的 iOS 版本上,每次我们在任何设备上启动时都会收到此错误:
2018-04-25 14:42:18.792216-0700 Steri-Vac GS[1090:855706] -[MasterNavigationViewController _viewControllerSubtreeDidGainViewController:]:无法识别的选择器发送到实例 0x101210100 2018-04-25 14:42:18.792662-0700 Steri-Vac GS[1090:855706] * 由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因: '-[MasterNavigationViewController _viewControllerSubtreeDidGainViewController:]: 无法识别的选择器发送到实例 0x101210100' * 第一次抛出调用栈:(0x186c4b164 0x185e94528 0x186c58628 0x1905c6188 0x186c50b10 0x186b35ccc 0x19029a964 0x19029d2c0 0x100a4941c 0x100a48bec 0x190205a00 0x1902055d8 0x19020c1a4 0x190209404 0x1902782e8 0x100a77a24 0x1902742c4 0x190465bc4 0x19046aa14 0x1907062a8 0x1909de100 0x190705f0c 0x19070676c 0x190e8b7c0 0x190e8b664 0x190bf92cc 0x190d923cc 0x190bf917c 0x1909dd760 0x190469158 0x19087edbc 0x18930e1f0 0x189316af8 0x100bb928c 0x100bc59e4 0x1893427f8 0x18934249c 0x189342a38 0x186bf377c 0x186bf36fc 0x186bf2f84 0x186bf0b5c 0x186b10c58 0x1889bcf84 0x1902695c4 0x100a51994 0x18663056c) libc++abi.dylib: 以 NSException 类型的未捕获异常终止
我已经向 Apple 提交了一个错误并提交了代码来支持它,但我想我会在这里与智囊团核实一下,看看是否有人有任何我可以同时调查的东西。目前我们的应用程序毫无用处,我 40% 的现场服务技术人员已经更新到 11.3,所以这对我们来说是一个关键问题。
提前谢谢各位!
【问题讨论】:
-
您真的打算将
UINavigationController添加为另一个UINavigationController的childViewController 吗?并将其 view 添加为子视图?或者……MasterNavigationViewController不是导航控制器? -
我继承了这个应用程序,并不太了解它,但我可以告诉你,它是一个非常分层的专家系统,用于对工业系统进行故障排除,所以它有很多不同的子导航树遵循测试/故障排除流程图。我也知道它在 11.3 之前可以正常工作,所以可以合理地假设是的,实际上,我们想要添加导航控制器作为主视图控制器的子视图。
-
OK - 不知道该看什么... 快速测试,其中
self是UIViewController子类,DocumentViewController也是基本UIViewController子类,您的代码运行良好对我来说——将导航控制器的视图(包括导航栏和dc作为它的root)放入contentPanelUIView。想知道这个错误是否是一个红鲱鱼? -
MasterNavigationViewController是什么类型的对象? -
检查是
addChildViewController在主线程中被调用
标签: ios objective-c xcode uikit