通过“后退”按钮,弹出的UINavigationController定制放松赛格瑞(unwind w

2019-08-17 19:06发布

简单的故事板设置:使用的UIViewController UINavigationController的。 在一个表格单元格单击自定义赛格瑞将一个新的UIViewController到导航堆栈。 都好。 但随后在导航栏中按下“返回”按钮,它仅使用默认弹出动画。

如何弹出回来时,我告诉导航控制器使用个性化的SEGUE? 我已经添加

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

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

这两个视图控制器,但它们不会被调用。

我在想什么?

Answer 1:

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

第一种方法保持过渡代码。 后退按钮挖掘时,此过渡代码将自动使用。

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



Answer 2:

您是否尝试过使用类似:

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

我从来没有一个定制SEGUE,但假设他们所有其他人一样正常工作,你重写他们的时候,只要您的自定义赛格瑞类继承的UIStoryBoardSegue,它应该工作...

然后确保您已连结后退按钮“退出”图标,在视图控制器下面的吧。



Answer 3:

放松塞格斯是有用的“回滚”塞格斯,包括自定义塞格斯。 在你的用例的问题不在于塞格斯本身,而是要触发从后退按钮开卷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。

让我懂得这正好。



文章来源: unwind with custom segue on UINavigationController pop via “back” button