自定义解除争议iOS 8和iOS 9

我的问题是,我如何获得以下自定义展开segue在iOS 9之前版本的设备以及运行iOS 9的设备上工作?

我有一个自定义Segue显示一个视图控制器,然后有一个相应的自定义解绕Segue。 此代码在iOS 8中运行良好,并通过创buildUIStoryboardSegue的子类和实现perform方法来实现。 然后我重写我的自定义导航控制器中的以下方法:

 - (UIStoryboardSegue *) segueForUnwindingToViewController: (UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier { UIStoryboardSegue *segue; if([fromViewController isKindOfClass:[MyViewController class]]){ segue = [[CustomSegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController]; //Custom Unwind Segue } else{ UIStoryboardSegue *unwindSegue = [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; //Normal Unwind Segue segue = unwindSegue; } return segue; } 

在iOS 9中,不推荐使用segueForUnwindingToViewController 。 它仍然适用于MyViewController CustomSegue; 然而,默认的展开顺序不再适用于任何其他的展开顺序。 尽pipe在super上调用方法返回unwind segue,但segue从不会发生,视图控制器永远不会popup,并且用户永远不能回到上一个屏幕。 所以要清楚的是,如果我使用普通的show segue,则相应的unwind segue会调用不赞成使用的方法,该方法会调用super的方法,并且不起作用。

我观看了WWDC在故事板上的讨论,并且我能够通过以下方式解决这个问题:a)不再在我的自定义导航控制器中重写此方法; b)进入故事板,点击自定义的segue,然后inputCustomSegue作为Segue类。 不幸的是,由于我的目标是iOS 7,所以我得到了“仅在iOS 9之前支持类名称自定义支持”这一警告,而现在自定义展开顺序现在不适用于iOS 7或iOS 8!

经过大量的试验和错误,我find了一个解决方法。 我注意到,当你重写segueForUnwindingToViewControllerunwindForSegue:towardsViewController不再被调用,这是问题。 仅供参考,苹果在UIViewController中的说明segueForUnwindingToViewController说:

已过时。 返回一个segue,它将通过unwindForSegue:towardViewController:方法从源展开到目标视图控制器。 当执行故事板中定义的unwind segue时,如果展开path上的任何视图控制器已覆盖此方法并返回非零 ,则运行时将使用该segue对象,而不是构造Interface Builder中指定的类的实例。

粗体语句的部分似乎没有实现,即如果重写此方法,但返回nil,则unwindForSegue:towardViewController仍然不被调用,并且不会发生。

为了解决这个问题,我可以在我的自定义导航控制器中编辑segueForUnwindingToViewController

 - (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier { UIStoryboardSegue *segue; if([fromViewController isKindOfClass:[MyViewController class]]){ segue = [[CustomSegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController]; //Custom Unwind Segue } else{ if([[UIDevice currentDevice].systemVersion floatValue] < 9.0){ return [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; //Normal Unwind Segue } else{ [super unwindForSegue:segue towardsViewController:toViewController]; return nil; } } return segue; } 

更新:调用[super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; 似乎仍然为模态放松赛段工作。 我所描述的问题似乎发生在演出中。 因此,如果您的设备在<9.0版本上运行,或者如果segue是模态的,则仍然应该调用旧的方法。 如果你调用[super unwindForSegue:segue towardsViewController:toViewController]; 当赛格模态时,赛格将不会工作/发生。

我稍微修改了你的代码。
我不必考虑是推还是莫代尔。
它似乎工作正常。

 - (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier { UIStoryboardSegue *segue; if ([fromViewController isKindOfClass:[MyViewController class]]) { segue = [[CustomSegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController]; //Custom Unwind Segue } else { if ([super respondsToSelector:@selector(unwindForSegue:towardsViewController:)]) { [super unwindForSegue:segue towardsViewController:toViewController]; } segue = [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; } return segue; }