ios:使用 modalTransitionsytle 属性导航到另一个屏幕,导致应用程序崩溃

Posted

技术标签:

【中文标题】ios:使用 modalTransitionsytle 属性导航到另一个屏幕,导致应用程序崩溃【英文标题】:ios: Navigation to another screen using modalTransitionsytle attribute, crashes the app 【发布时间】:2011-12-09 11:29:03 【问题描述】:

我有导航界面,每次按下设置按钮时,我都会使用它弹出设置屏幕。

@interface Navigation : UINavigationController


-(void)popToMainMenuAnimated:(BOOL)animated;

//.m file
-(void)popToMainMenuAnimated:(BOOL)animated

    UIViewController *element;
    for(element in self.viewControllers)
    
        if([element isKindOfClass:[MainSettingClass class]])
          self.modalTransitionStyle = UIModalTransitionStylePartialCurl;
          [self presentModalViewController:element animated:YES]
        
     

应用程序因以下异常而崩溃。

* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“应用程序试图以模态方式呈现活动控制器。” * 首先抛出调用栈:

注意:这不是根屏幕,而是我的应用程序的第三个屏幕。

【问题讨论】:

【参考方案1】:

根据您提供的调试日志,我通过搜索得到了一个原因:您之前推送的MainSettingClass 实例既不能再次推送到navigationController 上的数组,也不能以模态方式呈现。您应该创建一个新的 MainSettingClass 实例并呈现它,就像第二个代码 sn-p 一样。

HERE 是一个提到Application tried to present modally an active controller 的相关问题。 :)

-(void)popToMainMenuAnimated:(BOOL)animated

    UIViewController *element;
    for(element in self.viewControllers) 
        if([element isKindOfClass:[MainSettingClass class]]) 
            self.modalTransitionStyle = UIModalTransitionStylePartialCurl;
            [self presentModalViewController:element animated:YES];
            break;
        
    

但为什么不是load Main Menu 而不是pop

-(void)loadMainMenuAnimated:(BOOL)animated

    MainSettingClass * mainMenuViewController = [[[MainSettingClass alloc] init] autoreleased];
    [mainMenuViewController.view setFrame:CGRectMake(0.0f, 0.0f, 320.0f, 480.0f)];
    // ...
    self.modalTransitionStyle = UIModalTransitionStylePartialCurl;
    [self presentModalViewController:mainMenuViewController animated:YES];


而且你展示的代码有一些错误:

self.modalTransitionStyle= UIModalTransitionStylePartialCurl;
[self popToViewController:element animated:YES];

self.modalTransitionStyle= UIModalTransitionStylePartialCurl;如果你设置了这个,你需要使用

[self presentModalViewController:yourViewController animated:YES];

不是

[self popToViewController:element animated:YES];

【讨论】:

我按照建议进行了更改,但这导致我的应用程序崩溃。以前只有过渡属性没有被遵守,无论我选择什么风格,它总是以默认方式过渡。 使用 [self popToViewController:element animated:YES] 正确进行转换;但我希望转换不是默认的,而是 UIModalTransitionStylePartialCurl 的。当我尝试您的更改时: [self.modalTransitionStyle= UIModalTransitionStylePartialCurl; [自我presentModalViewController:元素动画:是];应用崩溃。 @RakeshSingh 我很抱歉我的错误。现在怎么样? 还是没有运气。我只想通过弹出视图使用。应用程序仍然因 BAD_MEMORY_EXCESS 而崩溃 @RakeshSingh BAD_MEMORY_EXCESS,你的意思是 EXC_BAD_ACCESS?也许您需要找出导致此崩溃的原因,请参阅THIS 答案以找出答案。 :)【参考方案2】:

您选择并尝试呈现(模态)的“MainSettingsClass”UIViewController 似乎已经处于活动状态。如果您在此视图控制器之前可能已推送/呈现(理想情况下弹出/关闭)的位置放置代码,将会有所帮助。

这里有一个couple related 的问题可能对您有所帮助。

【讨论】:

以上是关于ios:使用 modalTransitionsytle 属性导航到另一个屏幕,导致应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

[iOS] 在 ios10 中使用 imessage

使用 SmartFace.io 录制音频(Android - Ios)

iOS - 如何使用 branch.io 在 Appstore 中测试深度链接

IOS AlterView的使用(IOS8.0以前使用)

iOS归档使用

Agora.io - 如何使用 mediaPlayer 共享视频时间戳? - iOS