通过“后退”按钮在UINavigationController上弹出自定义segue

时间:2013-03-20 14:43:22

标签: cocoa-touch ios6 uistoryboard uistoryboardsegue

简单的故事板设置: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

两个视图控制器,但根本不会被调用。

我错过了什么?

3 个答案:

答案 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。

让我知道这是怎么回事。