Pop UIViewController使用Custom Segue?

时间:2016-06-14 05:36:04

标签: ios uinavigationcontroller transition uistoryboardsegue

我正在关注this回答"发布"我以前在UINavigationController中的视图控制器。

它工作正常但弹出部分是我难以上班的代码。基本上我的应用程序就是这样的。它从主菜单(View 1)开始,然后推送到View 2,然后我使用自定义推送segue进入View 3.现在我想使用不同的自定义segue进行弹出,从View 3转到View 2。但是,通过使用下面的代码,它会很快弹出View 1,然后最终推送到View 2.看起来视图控制器转换是不自然的,我只是想通过使用自定义segue来实现通常的pop转换到"发布"源视图控制器。

这是我现在使用的代码无效:

- (void)perform {
    // Grab Variables for readability
    UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
    UIViewController *destinationController = (UIViewController*)[self destinationViewController];
    UINavigationController *navigationController = sourceViewController.navigationController;

    // Get a changeable copy of the stack
    NSMutableArray *controllerStack = [NSMutableArray arrayWithArray:navigationController.viewControllers];
    // Replace the source controller with the destination controller, wherever the source may be
    [controllerStack addObject:destinationController];

    // Assign the updated stack with animation
    [navigationController setViewControllers:controllerStack animated:YES];
}

我在这里做错了吗?

3 个答案:

答案 0 :(得分:1)

你想要的是一个"放松" Segue公司。有关这些内容的更多信息:https://spin.atomicobject.com/2014/10/25/ios-unwind-segues/

答案 1 :(得分:0)

如果你只想弹出View 3返回View 2,你不能只做这样的事吗?

- (void)perform {
    UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
    UINavigationController *navigationController = sourceViewController.navigationController;
    [navigationController popViewControllerAnimated:YES];
}

答案 2 :(得分:0)

我不确定这个答案是否已经本地化,但是在记录我的导航堆栈层次结构并使用数组后,我做到了这一点并且对我来说效果很好。

- (void)perform {
    // Grab Variables for readability
    UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
    UIViewController *destinationController = (UIViewController*)[self destinationViewController];
    UINavigationController *navigationController = sourceViewController.navigationController;

    // Get a changeable copy of the stack
    NSMutableArray *controllerStack = [NSMutableArray arrayWithArray:navigationController.viewControllers];
    [controllerStack replaceObjectAtIndex:1 withObject:destinationController];
    [controllerStack addObject:sourceViewController];

    [navigationController setViewControllers:controllerStack animated:NO];
    [navigationController popViewControllerAnimated:YES];
}

更广泛的答案可能是在数组中找到源视图控制器对象的索引,并将目标视图控制器添加到它之前的索引,将前一个索引中的所有内容从前一个位置移动,这样你就不会不要弄乱任何其他视图控制器。正如我所说,索引1在这种情况下特别适合我。