应用程序试图在目标上呈现一个 nil 模态视图控制器

Posted

技术标签:

【中文标题】应用程序试图在目标上呈现一个 nil 模态视图控制器【英文标题】:Application tried to present a nil modal view controller on target 【发布时间】:2013-08-27 09:38:34 【问题描述】:

我有一个简单的单视图应用程序,其中包含两个故事板,纵向和横向布局不同。景观布局完全不同,这就是我使用第二个故事板的原因。

当我切换到横向时,视图没有改变,我得到了

“”

` 调试器中的错误。我检查了风景故事板是否引用了 CalculatorViewController 类。

这是产生错误的代码行:

[self presentViewController:landscapeViewController animated:YES completion:nil];

这是来自 CalculatorViewController.m 的整个方法:

- (void)orientationChanged:(NSNotification *)notification

    
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
        if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
           !isShowingLandscapeView)        
    
       // code here to show landscape storyboard
        UIStoryboard *landscapeStoryboard = [UIStoryboard storyboardWithName:@"LandscapeStoryboard" bundle:nil];

        CalculatorViewControllerLandscape *landscapeViewController = [landscapeStoryboard instantiateInitialViewController];
        [self presentViewController:landscapeViewController animated:YES completion:nil];
        isShowingLandscapeView = YES;
        
    else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&             
         isShowingLandscapeView)        
            
        [self dismissViewControllerAnimated:YES completion:nil];        
        isShowingLandscapeView = NO;        
    

初始视图控制器称为 CalculatorViewController。 横向布局的视图控制器称为 CalculatorViewControllerLandscape。

这是我的第一个应用程序,所以我非常感谢任何帮助。我已尝试在未成功发布的类似问题中找到解决方案。

【问题讨论】:

别忘了接受 Gabriele Petronella 的回答。看来他终于帮到你了。 【参考方案1】:

表示landscapeViewControllernil

这可能是由以下任一原因引起的:

landscapeStoryboardnil(很可能是因为找不到名为 LandscapeStoryboard 的故事板) 情节提要中未指示初始视图控制器。

【讨论】:

我已经仔细检查了拼写和大小写,并且 LandscapeStoryboard 肯定存在。CalculatorViewController 被设置为初始视图控制器。 你能检查storyboard是否是nil吗?使用断点或NSLog 我没有在 LandscapeStoryboard 中选中初始视图控制器检查框。当我这样做时,我得到一个不同的错误:NSUnknownKeyException',原因:'[ setValue:forUndefinedKey:]:这个类不是键 aButton 的键值编码兼容。我也不明白这个错误。 这意味着你有一个aButton 的悬空出口。在 Interface Builder 中检查 CalculatorViewControllerLandscape 上的每个插座 我设置了一个断点,它显示 LandscapeStoryboard = (UIStoryboard *)0x07175c40。【参考方案2】:

您需要确保情节提要横向视图的标识符设置为“LandscapeStoryboard”。选择情节提要并检查标识符。

【讨论】:

LandscapeStoryboard 是故事板的名称而不是控制器的名称(duh) 现在你的回答没有意义。故事板是按文件名查找的,因此您只需选择正确的名称即可。没有要设置的标识符。 实际上,如果我也删除标识符,它也可以工作。我做的另外两件事是重置风景故事板类,即使它设置正确,也将故事板名称复制并传递到代码中,即使它也拼写正确。奇怪但现在有效。谢谢你们的帮助。正弦 @Gabriele Petronella,我通常使用self.ViewLandscapeViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"LandscapeViewController"];,它使用标识符。但在这种情况下,您可能是对的。 @Sinead,你真的应该考虑接受 Gabriele Petronella 的回答。他在帮助你方面做得很好!

以上是关于应用程序试图在目标上呈现一个 nil 模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“应用程序试图在目标上呈现一个 nil 模态视图控制器

应用程序试图在目标 <UIApplicationRotationFollowingController: 0x100c75280> 上呈现一个 nil 模态视图控制器

应用程序试图在 React Native Objective-C 扩展中的目标上呈现一个 nil 模态视图控制器

Redlaser SDK 和 nil 模态视图控制器

iOS UISearchController 崩溃:应用程序试图在自身上呈现模态视图控制器

无法使用 AVPlayerViewController 显示电影