Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to
activate constraint with anchors <NSLayoutDimension:0x283e9cc40 "_UINavigationBarTitleControl:0x115566ce0.height">
and <NSLayoutDimension:0x283eb3500 "UILayoutGuide:0x281205500'TitleViewGuide(0x115542e70)'.height"> because they have no common ancestor.
Does the constraint or its anchors reference items in different view hierarchies? That's illegal.'
-[XXViewController viewWillDisappear:] (in XXApp) (XXViewController.m:298)
self.navigationController.navigationBarHidden = NO;
-[_UINavigationBarTitleControl updateConstraints] (in UIKitCore) + 1368,
-[UIView(Hierarchy) layoutBelowIfNeeded] (in UIKitCore) + 292
-[UINavigationController _positionNavigationBarHidden:edge:] (in UIKitCore) + 268
......
-[UINavigationController setNavigationBarHidden:animated:] (in UIKitCore) + 96
-[XXViewController viewWillDisappear:] (in JD...) (XXViewController.m:298)
目前来看崩溃都是因为页面切换时将系统导航栏隐藏状态变更导致的Crash,崩溃页面为首页或者RN页等页面层级比较靠前的页面。经过和同事测试发现,Xcode 14-beta版本编译运行iOS 16.1机型并不能复现Crash,但是使用Xcode 13+iOS 16.1模拟器经过不断切页面测试,复现了崩溃。复现路径为:启动App进入首页,首页进一个隐藏导航栏的页面,然后再进一个原生导航栏的页面,再返回到首页。
-(void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated{
if (!self.navigationBar.superview) return;
[super setNavigationBarHidden:hidden animated:animated];
}
<NSLayoutDimension:0x283e9cc40 "UINavigationBarTitleControl:0x115566ce0.height">
and <NSLayoutDimension:0x283eb3500 "UILayoutGuide:0x281205500'TitleViewGuide(0x115542e70)'.height">
-(void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated{
if (@available(iOS 16.1, *)) {
[self.navigationBar setNeedsLayout];
[self.navigationBar layoutIfNeeded];
}
[super setNavigationBarHidden:hidden animated:animated];
}