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

 

转载于:https://www.cnblogs.com/csutanyu/articles/4001062.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值