"NSInternalInconsistencyException [...] Sigh. Contentview size is zero." 使用 UINavigationController 时崩溃
"NSInternalInconsistencyException [...] Sigh. Contentview size is zero." crash when using a UINavigationController
我的代码 运行 在 iOS 10.3.3 上完全没问题,而当我 运行 在 iOS 11.2.1 上使用相同的代码时,它会导致崩溃在启动时出现以下错误:
Assertion failure in -[_UINavigationBarVisualProviderModernIOS _contentViewFittingHeight], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3698.33.7/_UINavigationBarVisualProviderModernIOS.m:569
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Sigh. Contentview size is zero.'
我清理了代码,清除了派生数据,但这些都没有解决问题。
我用于幻灯片菜单的库中出现问题 "iOS-Slide-Menu"。所以,我只是简单地更改了库中的这两个方法,然后就可以正常工作了。
- (void)setup
{
[[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"ssidName"];
[[NSUserDefaults standardUserDefaults] synchronize];
if (singletonInstance)
NSLog(@"Singleton instance already exists. You can only instantiate one instance of SlideNavigationController. This could cause major issues");
singletonInstance = self;
self.menuRevealAnimationDuration = MENU_SLIDE_ANIMATION_DURATION;
self.menuRevealAnimationOption = MENU_SLIDE_ANIMATION_OPTION;
}
- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
// Update shadow size of enabled
if (self.enableShadow)
self.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.bounds].CGPath;
self.landscapeSlideOffset = self.view.frame.size.width/6;
self.portraitSlideOffset = self.view.frame.size.width/6;
self.panGestureSideOffset = 0;
self.avoidSwitchingToSameClassViewController = YES;
self.enableShadow = YES;
self.enableSwipeGesture = NO;
self.delegate = self;
// When menu open we disable user interaction
// When rotates we want to make sure that userInteraction is enabled again
[self enableTapGestureToCloseMenu:NO];
if (self.menuNeedsLayout)
{
[self updateMenuFrameAndTransformAccordingToOrientation];
// Handle different horizontal/vertical slideOffset during rotation
// On iOS below 8 we just close the menu, iOS8 handles rotation better so we support keepiong the menu open
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0") && [self isMenuOpen])
{
Menu menu = (self.horizontalLocation > 0) ? MenuLeft : MenuRight;
[self openMenu:menu withDuration:0 andCompletion:nil];
}
self.menuNeedsLayout = NO;
}
}
修正了,这两行必须在 viewWillLayoutSubviews
而不是 setup
方法中。正如@Ishika 所说,这是 iOS-Slide-Menu.
的问题
self.enableShadow = YES;
self.enableSwipeGesture = YES;
我使用 Xcode 10.2.1 和 SideMenu 6.0.4 时出现此错误。我最终以编程方式配置导航控制器,这解决了问题。
let sideMenuVc = UISideMenuNavigationController(rootViewController: <view controller>)
我的代码 运行 在 iOS 10.3.3 上完全没问题,而当我 运行 在 iOS 11.2.1 上使用相同的代码时,它会导致崩溃在启动时出现以下错误:
Assertion failure in -[_UINavigationBarVisualProviderModernIOS _contentViewFittingHeight], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3698.33.7/_UINavigationBarVisualProviderModernIOS.m:569
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Sigh. Contentview size is zero.'
我清理了代码,清除了派生数据,但这些都没有解决问题。
我用于幻灯片菜单的库中出现问题 "iOS-Slide-Menu"。所以,我只是简单地更改了库中的这两个方法,然后就可以正常工作了。
- (void)setup
{
[[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"ssidName"];
[[NSUserDefaults standardUserDefaults] synchronize];
if (singletonInstance)
NSLog(@"Singleton instance already exists. You can only instantiate one instance of SlideNavigationController. This could cause major issues");
singletonInstance = self;
self.menuRevealAnimationDuration = MENU_SLIDE_ANIMATION_DURATION;
self.menuRevealAnimationOption = MENU_SLIDE_ANIMATION_OPTION;
}
- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
// Update shadow size of enabled
if (self.enableShadow)
self.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.bounds].CGPath;
self.landscapeSlideOffset = self.view.frame.size.width/6;
self.portraitSlideOffset = self.view.frame.size.width/6;
self.panGestureSideOffset = 0;
self.avoidSwitchingToSameClassViewController = YES;
self.enableShadow = YES;
self.enableSwipeGesture = NO;
self.delegate = self;
// When menu open we disable user interaction
// When rotates we want to make sure that userInteraction is enabled again
[self enableTapGestureToCloseMenu:NO];
if (self.menuNeedsLayout)
{
[self updateMenuFrameAndTransformAccordingToOrientation];
// Handle different horizontal/vertical slideOffset during rotation
// On iOS below 8 we just close the menu, iOS8 handles rotation better so we support keepiong the menu open
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0") && [self isMenuOpen])
{
Menu menu = (self.horizontalLocation > 0) ? MenuLeft : MenuRight;
[self openMenu:menu withDuration:0 andCompletion:nil];
}
self.menuNeedsLayout = NO;
}
}
修正了,这两行必须在 viewWillLayoutSubviews
而不是 setup
方法中。正如@Ishika 所说,这是 iOS-Slide-Menu.
self.enableShadow = YES;
self.enableSwipeGesture = YES;
我使用 Xcode 10.2.1 和 SideMenu 6.0.4 时出现此错误。我最终以编程方式配置导航控制器,这解决了问题。
let sideMenuVc = UISideMenuNavigationController(rootViewController: <view controller>)