【问题标题】:Weird custom segue behavior - Navigation stack corruption奇怪的自定义 segue 行为 - 导航堆栈损坏
【发布时间】:2012-12-07 11:11:11
【问题描述】:

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

还有自定义的pop 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];

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

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

【问题讨论】:

    标签: iphone objective-c ios uinavigationcontroller uistoryboard


    【解决方案1】:

    您的 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 中。您完全失去了导航栏和配置它们的能力(在故事板中 - 它们仍然存在于应用程序中)。

    【讨论】:

    • 感谢您的回答这是问题.. 太傻了,我没看到。无论如何,我在故事板中看不到任何损坏。它似乎工作得很好。你会建议我使用常规的 .xib 文件吗?
    • 如果情节提要适合您,请继续使用它 - 它有助于您了解导航逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    相关资源
    最近更新 更多