6

简单的故事板设置:带有 UINavigationController 的 UIViewController。在表格单元格上单击自定义 segue 将新的 UIViewController 推送到导航堆栈上。都好。但是在导航栏中按下“返回”按钮,它只使用默认的弹出动画。

我如何告诉导航控制器在弹出时使用我的自定义 segue?我已经添加

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender

到两个视图控制器,但它们根本没有被调用。

我错过了什么?

4

3 回答 3

11

您可以通过创建自定义转换而不是使用自定义转场来完成此操作。我花了一段时间才明白,但基本上很简单。只需确保您的第一个视图控制器采用 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 中,告诉导航控制器第一个视图控制器将充当其委托:

self.navigationController.delegate = self;

最后但同样重要的是,创建一个采用 UIViewControllerAnimatedTransitioning 协议的动画器类。实现以下方法:

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext

第一种方法保存转换代码。当点击后退按钮时,将自动使用此转换代码。

这是一个非常简单的示例项目

于 2014-06-06T13:58:27.827 回答
2

展开转场对于“回滚”转场很有用,包括自定义转场。您的用例中的问题不在于 segue 本身,而在于您想从后退按钮触发 unwind 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];
}

显然,这不再与展开无关——它只是执行一个自定义的转场,您实现该转场以“回滚”您最初用来“推动”细节视图控制器的转场。

让我知道这是怎么回事。

于 2013-03-22T16:39:32.740 回答
2

您是否尝试过使用类似的东西:

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
{
    return [MyCustomSegueInitMethod viewControllerA:vc1 viewControllerB: vcB];
}

我从来没有做过自定义segue,但是假设它们在覆盖它们时像所有其他人一样工作,只要您的自定义segue类是UIStoryBoardSegue的子类,它应该可以工作......

然后确保您已将后退按钮链接到视图控制器下方栏中的“退出”图标。

于 2013-03-20T17:04:34.147 回答