Iphone 奇怪的自定义segue行为-导航堆栈损坏

Iphone 奇怪的自定义segue行为-导航堆栈损坏,iphone,objective-c,ios,uinavigationcontroller,uistoryboard,Iphone,Objective C,Ios,Uinavigationcontroller,Uistoryboard,我有一个很大的应用程序,其中有许多使用故事板的转换。 转换应该是从右到左,所以我做了一个自定义的segue来执行它 当我使用常规转换时,我推入导航堆栈的每个视图控制器都会被保留,直到我弹出它为止 虽然使用自定义segues不会保留以前的控制器(推送当前控制器的控制器),但当我返回时,控制器的实例会获得不同的内存地址,这表明指针已更改 这是自定义推送序列: UIViewController *sourceViewController = (UIViewController*)[self

我有一个很大的应用程序,其中有许多使用故事板的转换。 转换应该是从右到左,所以我做了一个自定义的segue来执行它

当我使用常规转换时,我推入导航堆栈的每个视图控制器都会被保留,直到我弹出它为止

虽然使用自定义segues不会保留以前的控制器(推送当前控制器的控制器),但当我返回时,控制器的实例会获得不同的内存地址,这表明指针已更改

这是自定义推送序列:

UIViewController *sourceViewController = (UIViewController*)[self         sourceViewController];
UIViewController *destinationController = (UIViewController*)[self   destinationViewController];

CATransition* transition = [CATransition animation];
transition.duration = .3f;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;

[sourceViewController.navigationController.view.layer addAnimation:transition
                                                            forKey:kCATransition];

[sourceViewController.navigationController pushViewController:destinationController animated:NO];
还有定制的流行音乐:

UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
UIViewController *destinationController = (UIViewController*)[self destinationViewController];

CATransition* transition = [CATransition animation];
transition.duration = .3f;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;

[sourceViewController.navigationController.view.layer addAnimation:transition
                                                            forKey:kCATransition];

[sourceViewController.navigationController pushViewController:destinationController animated:NO];
我使用以下方法执行segue:

[self performSegueWithIdentifier:@"SearchToMenu" sender:self];
似乎什么都没用,我也没有在网上找到任何东西


如果我需要提供更多的代码示例、屏幕截图等,请告诉我。

您的popViewController正在推送,而不是弹出

这一行:

 [sourceViewController.navigationController pushViewController:destinationController animated:NO];
应该是:

[sourceViewController.navigationController popViewControllerAnimated:NO];
您的自定义segue不保留以前的控制器。但是segue的destinationController总是一个新实例化的对象。您注意到新控制器的内存地址不同,但如果检查
[self.navigationController viewControllers]
堆栈,您将看到原始viewController仍然存在,堆栈上有三个对象。在此更正的版本中,您将按照自己的意愿返回到ViewController的该实例

这就是为什么您永远不应该使用标准推送序列导航回堆栈中较低的位置。尽管故事板会暗示这就是将要发生的事情,但这是一种错觉:您的应用程序只是导航到上一个viewController类的新实例。它在初始状态下看起来与前一个完全相同,因为它使用相同的故事板布局


你的是一个很好的例子,在这个例子中,最好不要使用segue。这不仅让人困惑,而且,当您弹出返回时,如果您试图在prepareForSegue中配置“destinationViewController”,它将不会对弹出返回的viewController产生任何影响。您可能还注意到,故事板变得混乱,因为它无法跟踪哪个viewController包含在哪个NavController中。你完全失去了导航栏和配置它们的能力(在故事板中-它们仍然在应用程序中)

谢谢你的回答这就是问题所在。。太傻了,我没看见。不管怎样,我在故事板上没有看到任何腐败。它似乎工作得很好。你会建议我使用常规的.xib文件吗?如果情节提要对你合适,请继续使用它-它有助于你了解你的导航逻辑。