iOS 7 UINavigationController 对开始/结束外观转换的不平衡调用

Posted

技术标签:

【中文标题】iOS 7 UINavigationController 对开始/结束外观转换的不平衡调用【英文标题】:iOS 7 UINavigationController Unbalanced calls to begin/end appearance transitions for 【发布时间】:2013-09-19 09:47:25 【问题描述】:

我正在使用以下代码在 ViewDeck 中切换视图,当我尝试弹出到现有视图时,它在 ios5 和 6 但 7 中完全没问题。屏幕变成了全白/黑。

-(void)switchViewWithViewController:(UIViewController*)viewControllerToSwitch

    if (viewControllerToSwitch)
    
        // Reset Menu Button
        [self.viewDeckController closeLeftViewAnimated:YES completion:^(IIViewDeckController *controller)
         
             [((BaseViewController*)viewControllerToSwitch) closeMenu];
         ];

        @try
        
            [((UINavigationController*)self.viewDeckController.centerController) pushViewController:viewControllerToSwitch animated:NO];
        
        @catch (NSException * ex)
        
            //“Pushing the same view controller instance more than once is not supported”
            NSRange range = [ex.reason rangeOfString:@"Pushing the same view controller instance more than once is not supported"];

            if([ex.name isEqualToString:@"NSInvalidArgumentException"] && range.location != NSNotFound)
            
                //view controller already exists in the stack - just pop back to it
                if (!IS_IOS7)
                
                    [((UINavigationController*)self.viewDeckController.centerController) popToViewController:viewControllerToSwitch animated:NO];
                
                else
                
                    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^(void)
                    
                        [((UINavigationController*)self.viewDeckController.centerController) popToViewController:viewControllerToSwitch animated:NO];
                    );
                
            
        
    

我确实尝试添加延迟 0.1,但这无济于事。 从控制台,我发现它同时弹出了两个 VC。

Unbalanced calls to begin/end appearance transitions for <GameViewController: 0x15ef5630>.
-[BaseViewController viewDidAppear:] [Line 49] VC is showing: GameViewController
-[BaseViewController viewDidAppear:] [Line 49] VC is showing: HomePageViewController

【问题讨论】:

【参考方案1】:

我承认使用 try 和 catch 不是一个好习惯。由于问题是关于 ViewDeck,所以我只是简单地替换 centerViewController,并避免 UINavigationController 的 push pop stack 错误。

这里是代码。希望它可以帮助某人。

-(void)switchViewWithViewController:(BaseViewController*)viewControllerToSwitch

    if (viewControllerToSwitch)
    
        // Reset Menu Button
        [self.viewDeckController closeLeftViewAnimated:YES completion:^(IIViewDeckController *controller)
         
             [viewControllerToSwitch closeMenu];
         ];

        UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:viewControllerToSwitch];
        self.viewDeckController.centerController = navVC;
    

【讨论】:

【参考方案2】:

希望您已解决此问题。 1、我不认为使用@try @catch 来判断push 还是pop 是个好主意。 2,我在iOS7中也遇到了这种“对...blabla的不平衡调用”的东西。我的情况,我需要强制旋转屏幕然后弹出到最后一个视图控制器。在 iOS 5 或 6 中,只需强制旋转

-(void)viewWillDisappear
,它工作正常,但 iOS7 崩溃了。所以在iOS7中我先强制旋转然后弹出。 根据这个https://***.com/a/17440074/1343200,

“动画在最后一个相关动画未完成之前开始。”

【讨论】:

同意。使用 try and catch 不是一个好主意。当我使用 ViewDeck 时,只需创建一个新的 centerViewController 并替换它即可。

以上是关于iOS 7 UINavigationController 对开始/结束外观转换的不平衡调用的主要内容,如果未能解决你的问题,请参考以下文章

功能差异,UINavigationController vs Only Storyboard Segue

在 UINavigationController 中设置自定义导航栏类

在 UINavigationController 中设置自定义导航栏类

在 Swift 2.0 中设置 UINavigationController 栏标题

UINavigationController -> UIViewController -> UIView -> UITableViewController?

用动画隐藏导航控制器和标签栏控制器