通过"back"按钮在UINavigation控制器弹出时使用自定义续集放松



简单的故事板设置:UIViewController with UINavigationController。在一个表格单元格上点击一个自定义segue将一个新的UIViewController推送到导航堆栈上。所有的好。但是按下导航栏上的"后退"按钮,它只使用默认的弹出动画。

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

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender

给两个视图控制器但它们根本不会被调用

我错过了什么?

您可以通过创建自定义过渡而不是使用自定义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

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

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

你有没有试过这样写:

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

我从来没有做过自定义segue,但假设它们在重写它们时像其他所有人一样工作,只要你的自定义segue类是UIStoryBoardSegue的子类,它就应该工作…

然后确保你已经将后退按钮链接到视图控制器下方栏中的"exit"图标

Unwind segue对于"回滚"segue很有用,包括自定义segue。你的用例中的问题不在于segue本身,而在于你想从back按钮触发unwind 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];
}

显然这不再与unwind有任何关系-它只是执行一个自定义segue,你实现它来"回滚"你最初用来"推送"detail视图控制器的segue。

最新更新