这就是我的视图控制器层次结构:
-RootVC
-MapVC
-VC0
-VC1
-VC2这个应用程序一开始就把@Root,MapVC推到视图控制器上--一切都很好。然后,我的目标是在四个主要VC2 (MapVC、VC0、VC1、VC2)之间进行更改时加载地图(因此,我不想弹出该MapVC)。
为此,我使用以下代码:
-(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]];
}-展示地图的方法:
-(void)presentMapViewController:(NSNotification*)notif{
if (![[self.navigationController.viewControllers objectAtIndex:[[self.navigationController viewControllers] count]-1] isKindOfClass:[LLMapViewController class]]){
[self.navigationController popViewControllerAnimated:YES];
}
}好吧,如果我不给这个过渡注入活力的话,效果会很好。另外,当我执行以下操作时,一切都很好
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时:
3: Select VC0
->Root
->Map
....崩溃!
它没有显示任何一致的错误。有时它不会显示任何错误,有时会显示这样的错误:
Example 1:
-[NSLayoutConstraint navigationController:animationControllerForOperation:fromViewController:toViewController:]:
Example 2:
-[UILabel navigationController:animationControllerForOperation:fromViewController:toViewController:]:但是,当我设置导航控制器的视图控制器时,它总是突出显示这个部分。
我的问题:我花了大约8个小时来解决这个问题。关于如何调试这个问题,我没有更多的想法。谁能帮帮我吗?
我正在使用自定义转换来推送/弹出控制器。以下是附加代码:
-(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;
}
} --
#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];
}];
}
}发布于 2015-01-25 22:29:54
我不相信你能以你想要的方式使用UINavigationController。如果我已经理解了您想要做的事情,那么您希望从导航控制器下面替换导航控制器的viewControllers属性。
顺便说一下,显示的viewControllers属性是一个副本。这就是在文档中定义它的方式
@property(nonatomic, copy) NSArray *viewControllers你的代码:
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。
顺便说一句,您在上述问题的前几行中绘制的视图控制器层次结构是不完整的。层次结构中的导航控制器在哪里?
https://stackoverflow.com/questions/27995338
复制相似问题