从一个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:)实现。

 

posted on 2014-09-29 22:08  课蜜黄蜂  阅读(596)  评论(0编辑  收藏  举报