使用segueWithIdentifier自定义UIStoryboardSegue:source:destination:performHandler:

Jaz*_*zer 19 iphone objective-c ios uistoryboardsegue

我试图使用自定义UIStoryboardSegue来实现两个视图控制器之间的转换.我可以通过子类化UIStoryboardSegue,然后在IB中设置此类来完成此操作.但是,我正在查看说:

如果您的segue不需要存储其他信息或提供除perform方法之外的任何信息,请考虑使用segueWithIdentifier:source:destination:performHandler:方法.

暗示您不需要创建自定义子类,只需使用自定义performHandler即可.

我很困惑这个代码应该去哪里,以及我如何使用它.我是否在IB中正常创建segue,然后在触发之前覆盖它(可能在shouldPerformSegue:或类似).在Apple的文档中,它说:

您的应用永远不会直接创建segue对象; 当触发segue时,它们总是由iOS代表您创建

所以我不太明白为什么他们会说使用类创建方法实例化segue.

mem*_*ons 18

重点 segueWithIdentifier:source:destination:performHandler:

  • UIViewController performSegueWithIdentifier:sender如果您还想创建自定义转换,而不创建segue子类,请提供替代方法.
  • 提供可用作回报的segue segueForUnwindingToViewController:fromViewController:identifier

如上所述,这种方法仅适用于您手动调用的segues - 即不适用于否则将通过IB触发器触发的segue.

因此,例如,如果您有一个需要在特定超时期限后触发的segue(例如自定义锁定屏幕),则可以使用它segueWithIdentifier:source:destination:performHandler:来处理自定义转换.

-(void)appTimeoutLockScreen
{
    UIStoryboardSegue *segue = 
                [UIStoryboardSegue segueWithIdentifier:@"LockScreenSegue" 
                                                source:sourceVC 
                                           destination:destinationVC 
                                        performHandler:^{
                     // transition code that would 
                     // normally go in the perform method
                }];
    // Dev is responsible for calling prepareForSegue and perform.
    // Note, the order of calls for an IB triggered segue as well as
    // a performSegueWithIdentifier segue is perform first, then
    // prepareForSegue:sender. Manual segues need to inverse the call
    // in order to ensure VC setup is finished before transition.
    [self prepareForSegue:segue sender:self];
    [segue perform];
}
Run Code Online (Sandbox Code Playgroud)

该方法的另一个实际用途是展开segues.使用与前一个示例类似的场景,我们可以使用它来返回一个segue,从锁定屏幕转换回上一个viewController:

-(UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController*)toVC 
                                     fromViewController:(UIViewController *)fmVC
                                             identifier:(NSString *)identifier
{
    UIStoryboardSegue *segue = 
            [UIStoryboardSegue segueWithIdentifier:@"FromLockScreenSegue" 
                                            source:fmVC
                                       destination:toVC 
                                    performHandler:^{
                // transition code
            }];

    return segue;
}
Run Code Online (Sandbox Code Playgroud)