从一个Storyboard创建Segue跳转到另一个Storyboard
记之,备忘。
原版在这里。
直接上代码:
AOLinkedStoryboardSegue.h
#import <UIKit/UIKit.h> @interface AOLinkedStoryboardSegue : UIStoryboardSegue @end
AOLinkedStoryboardSegue.m
#import "AOLinkedStoryboardSegue.h" @implementation AOLinkedStoryboardSegue + (UIViewController *)sceneNamed:(NSString *)identifier { NSArray *info = [identifier componentsSeparatedByString:@"@"]; NSString *storyboard_name = info[1]; NSString *scene_name = info[0]; UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboard_name bundle:nil]; UIViewController *scene = nil; if (scene_name.length == 0) { scene = [storyboard instantiateInitialViewController]; } else { scene = [storyboard instantiateViewControllerWithIdentifier:scene_name]; } return scene; } - (id)initWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(UIViewController *)destination { return [super initWithIdentifier:identifier source:source destination:[AOLinkedStoryboardSegue sceneNamed:identifier]]; } - (void)perform { UIViewController *source = (UIViewController *)self.sourceViewController; [source.navigationController pushViewController:self.destinationViewController animated:YES]; } @end
使用该自定义的Segue要求ViewController要在UINavigationController中。Segue的类要选择自定义的类,
Segue的identifier格式为 ViewControllerIdentifier@StoryboardName。如果@之前为空,则使用Storyboard的initial view controller.
但是该代码只能在用于UINavigatonController的ViewController。不能处理present的viewcontroller
如果APP只布署在iOS 8+,则可以将perform方法修改如下:
- (void)perform { UIViewController *source = (UIViewController *)self.sourceViewController; [source showViewController:self.destinationViewController sender:self]; }
如果需要布署在iOS 8以下的系统,就只有创建两个子类了,把AOLinkedStoryboardSegue作为基类,去掉其perform方法。
可以定义一个PushLinkedStoryboardSegue和PresentLinkedStoryboardSegue,
分别在perform方法中使用UINavigationController的@selector(pushViewController: animated:)
或UIViewController中的@selector(presentViewController: animated:completion:)实现。