popToViewController, then pushViewController

3
在我的rootViewController之后,有一个类似于以下流程的工作流程
viewController1 -> push viewController2 -> push viewController3 -> ***** viewController2

我想要跳转至viewController3。然而,我需要先跳转至viewController1,因为viewController1基本上决定了要推送哪个viewController2的实例。所以我需要:

// pseudo code
[popToViewController:vc1 animated:NO];
[self.navigationController pushViewController2 animated:YES];

我基本上是先弹出再推入,这样我就不会出现vc2、vc3、vc2、vc3、vc2等情况。但是这样做,由于它动画化了最后一个视图控制器的推送,给用户的印象是推入了一个新的视图控制器,而不是弹回到上一个视图控制器。有没有办法解决这个问题?如果我只动画弹出,而不是最后一次推入,看起来我不能得到正确的顶部视图控制器。谢谢。

3个回答

1

你能使用类似的东西吗?

[self.navigationController setViewControllers:[NSArray arrayWithObject:yourViewController] 
                                     animated:YES];

你可以用想要的视图控制器填充数组。


1
@interface UINavigationController (PushThenPop)
-(void)popToViewController:(UIViewController*)rootViewController
    thenPushViewController:(UIViewController*)pushViewController;
@end


@implementation UINavigationController (PushThenPop)
-(void)popToViewController:(UIViewController*)rootViewController
    thenPushViewController:(UIViewController*)pushViewController
{
    NSMutableArray *viewControllers = self.viewControllers.mutableCopy;

    // Pop viewcontrollers until we reach the rootViewController
    while(viewControllers.count >= 1) {
        id last = [viewControllers lastObject];
        if (last == rootViewController) break;
        [viewControllers removeLastObject];
    }

    // Bail out the array is empty. We expect the array to contain at least 1 element, the rootViewController.
    if (!viewControllers.count) {
        return;
    }

    // Push the new view controller
    [viewControllers addObject:pushViewController];
    self.viewControllers = viewControllers.copy;
}
@end

0
您可以检索(viewControllers),修改并“重新安装”(setViewControllers)由导航控制器管理的视图控制器列表,并且理论上可以通过动画实现“重新安装”。 (但是,我在实践中遇到了一些动画问题,尽管我不记得细节。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接