记之,备忘。
原版在这里。
直接上代码:
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:)实现。