我正在关注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];
}
我在这里做错了吗?
答案 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在这种情况下特别适合我。