首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >设置NavigationController.Viewcontrollers崩溃(使用自定义转换)

设置NavigationController.Viewcontrollers崩溃(使用自定义转换)
EN

Stack Overflow用户
提问于 2015-01-17 01:43:48
回答 1查看 1.3K关注 0票数 3

这就是我的视图控制器层次结构:

代码语言:javascript
运行
复制
-RootVC
 -MapVC
  -VC0
  -VC1
  -VC2

这个应用程序一开始就把@Root,MapVC推到视图控制器上--一切都很好。然后,我的目标是在四个主要VC2 (MapVC、VC0、VC1、VC2)之间进行更改时加载地图(因此,我不想弹出该MapVC)。

为此,我使用以下代码:

代码语言:javascript
运行
复制
   -(void)presentViewController:(NSString*)viewControllerIdentifier{
    UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:viewControllerIdentifier];

    if (![[self.navigationController.viewControllers objectAtIndex:[[self.navigationController viewControllers] count]-1] isKindOfClass:[vc class]]){

        NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[[self navigationController] viewControllers]];
        if (![[viewControllers lastObject] isKindOfClass:[LLMapViewController class]]) {
        [viewControllers removeLastObject];
        }
        [viewControllers addObject:vc];
        [[self navigationController] setViewControllers:viewControllers animated:YES];
        }
}

-(void)presentViewController0:(NSNotification*)notif{
        [self presentViewController:[notif name]];
}

-展示地图的方法:

代码语言:javascript
运行
复制
-(void)presentMapViewController:(NSNotification*)notif{
    if (![[self.navigationController.viewControllers objectAtIndex:[[self.navigationController viewControllers] count]-1] isKindOfClass:[LLMapViewController class]]){
        [self.navigationController popViewControllerAnimated:YES];
    }
}

好吧,如果我不给这个过渡注入活力的话,效果会很好。另外,当我执行以下操作时,一切都很好

代码语言:javascript
运行
复制
App Launches:
->Root 
 ->MapVC

ACTIONS: 
0: Select VC0
->Root
 ->MapVC
  ->VC0

1: Select VC1 (Pops VC0 and pushes VC1, as you can see in the code above)
->Root
 ->MapVC
  ->VC1

2: Select MapVC (Pops VC1)
->Root
 ->MapVC

问题是,当我试图推动另一个以MapVC为主要VC的VC时:

代码语言:javascript
运行
复制
3: Select VC0
->Root
 ->Map
....

崩溃!

它没有显示任何一致的错误。有时它不会显示任何错误,有时会显示这样的错误:

代码语言:javascript
运行
复制
Example 1: 
-[NSLayoutConstraint navigationController:animationControllerForOperation:fromViewController:toViewController:]:

Example 2: 
-[UILabel navigationController:animationControllerForOperation:fromViewController:toViewController:]:

但是,当我设置导航控制器的视图控制器时,它总是突出显示这个部分。

我的问题:我花了大约8个小时来解决这个问题。关于如何调试这个问题,我没有更多的想法。谁能帮帮我吗?

我正在使用自定义转换来推送/弹出控制器。以下是附加代码:

代码语言:javascript
运行
复制
-(id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC {

    LLMenuAnimation *animationController = [[LLMenuAnimation alloc] initWithNavigationController:self.navigationController];
    switch (operation) {
        case UINavigationControllerOperationPush:
            animationController.type = AnimationTypePush;
            return  animationController;
        case UINavigationControllerOperationPop:
            animationController.type = AnimationTypePop;
            return animationController;
        default:
            NSLog(@"OTHER OPERATION");
            return nil;

    }


} 

--

代码语言:javascript
运行
复制
#pragma mark - Animated Transitioning

-(NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {
    return 0.2;
}

-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
    //Get references to the view hierarchy
    UIView *containerView = [transitionContext containerView];
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    if (self.type == AnimationTypePush) {
        //Add 'to' view to the hierarchy with 0.5 scale

        toViewController.view.transform = CGAffineTransformMakeScale(0.5, 0.5);


        [containerView insertSubview:toViewController.view aboveSubview:fromViewController.view];

        //Scale the 'to' view to to its final position
        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
            //            toViewController.view.frame = fromViewController.view.frame;
            toViewController.view.transform = CGAffineTransformMakeScale(1.0, 1.0);

        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    } else if (self.type == AnimationTypePop) {
        //Add 'to' view to the hierarchy
        [containerView insertSubview:toViewController.view belowSubview:fromViewController.view];

        //Scale the 'from' view down 
        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
            fromViewController.view.transform = CGAffineTransformMakeScale(0.5, 0.5);

        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-01-25 22:29:54

我不相信你能以你想要的方式使用UINavigationController。如果我已经理解了您想要做的事情,那么您希望从导航控制器下面替换导航控制器的viewControllers属性。

顺便说一下,显示的viewControllers属性是一个副本。这就是在文档中定义它的方式

代码语言:javascript
运行
复制
@property(nonatomic, copy) NSArray *viewControllers

你的代码:

代码语言:javascript
运行
复制
        NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[[self navigationController] viewControllers]];
    if (![[viewControllers lastObject] isKindOfClass:[LLMapViewController class]]) {
    [viewControllers removeLastObject];
    }
    [viewControllers addObject:vc];
    [[self navigationController] setViewControllers:viewControllers animated:YES];
    }

不会像你期望的那样工作。您可以将视图控制器推送到导航控制器上。您不能以您想要的方式替换viewControllers。

顺便说一句,您在上述问题的前几行中绘制的视图控制器层次结构是不完整的。层次结构中的导航控制器在哪里?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27995338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档