简单的故事板设置:UIViewController和UINavigationController。在表格单元格上单击自定义segue将新的UIViewController推送到导航堆栈。都好。但是按下导航栏中的“后退”按钮,它只使用默认的流行动画。
如何在弹出时告诉导航控制器使用我的自定义segue?我添加了
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
两个视图控制器,但根本不会被调用。
我错过了什么?
答案 0 :(得分:11)
您可以通过创建自定义转换而不是使用自定义segue来完成此操作。我花了一段时间才明白,但基本上很简单。只需确保您的第一个视图控制器采用UINavigationControllerDelegate协议。然后,仍然在第一个视图控制器中,实现以下方法:
- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC
{
return X // where X is an animation Controller object, an instance of the animator class.
}
仍然在第一个视图控制器中,例如在ViewDidLoad中,告诉navigationcontroller第一个视图控制器将充当其委托:
self.navigationController.delegate = self;
最后但并非最不重要的是,创建一个采用UIViewControllerAnimatedTransitioning协议的动画师类。实现以下方法:
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
和
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
第一种方法包含转换代码。点按后退按钮时,将自动使用此转换代码。
这是一个非常简单的example project。
答案 1 :(得分:2)
您是否尝试过使用以下内容:
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
{
return [MyCustomSegueInitMethod viewControllerA:vc1 viewControllerB: vcB];
}
我从来没有做过自定义segue,但是假设它们像覆盖它们时所做的那样工作,只要你的自定义segue类是UIStoryBoardSegue的子类,它应该有用......
然后确保您已将后退按钮链接到视图控制器下方栏中的“退出”图标。
答案 2 :(得分:2)
展开segues对于“回滚”segue非常有用,包括自定义segue。你的用例中的问题不在于segues本身,而在于你想要从后退按钮触发unwind segue。
这就是说,您可以尝试通过不使用展开来解决这个问题,但在点击标准后退按钮时触发自定义segue:
// MyDetailViewController.m:
- (void)viewWillDisappear:(BOOL)animated
{
if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) {
// trigger custom segue (but note that the sourceViewController
// has already been removed from the nav controller)
}
[super viewWillDisappear:animated];
}
显然这不再与展开有任何关系 - 它只是执行一个自定义segue,你可以实现“回滚”你用来“推”细节视图控制器的segue。
让我知道这是怎么回事。