2

我有一个使用故事板的大型应用程序,其中包含许多转换。转换应该是从右到左,所以我做了一个自定义的 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];

和自定义流行segue:

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];

似乎没有任何效果,我还没有在网上找到任何东西。

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

4

1 回答 1

0

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

这一行:

 [sourceViewController.navigationController pushViewController:destinationController animated:NO];

应该:

[sourceViewController.navigationController popViewControllerAnimated:NO];

您的自定义 segue 确实保留了以前的控制器。但是 segue 的destinationController 始终是一个新实例化的对象。您注意到您为新控制器获得了不同的内存地址,但是如果您检查[self.navigationController viewControllers]堆栈,您会发现原来的 viewController 仍然存在,堆栈上的三个对象。在这个更正的版本中,您将按照您的意愿返回到 viewContoller 的该实例。

这就是为什么你永远不应该使用标准的 push segue 来导航回堆栈中较低的任何位置。尽管情节提要会暗示这将发生,但这是虚幻的:您只是在导航到前一个 viewController 类的新实例。它在初始状态下看起来与前一个完全相同,因为它使用相同的 Storyboard 布局。

你的例子是一个很好的例子,最好不要使用segue。这不仅在这一点上令人困惑,而且当您弹回时,如果您尝试在 prepareForSegue 中配置“destinationViewController”,它不会对您弹回的 viewController 产生任何影响。您可能还注意到 Storyboard 变得一团糟,因为它忘记了哪个 viewController 包含在哪个 NavController 中。您完全失去了导航栏和配置它们的能力(在故事板中 - 它们仍然存在于应用程序中)。

于 2012-12-20T02:28:34.083 回答