UIStoryboard的简单封装

在项目中很多人使用storyboard开发,这里跳转的我列举几种方法

第一种方法

应该是大家用的最多的

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:kOwnerMineStoryBoard bundle:nil];
OwnerPersonalInformationViewController *ownerPersonalInformationVC = [storyboard          instantiateViewControllerWithIdentifier:@"OwnerPersonalInformationViewController"];
ownerPersonalInformationVC.ownerUserInfoModel = self.ownerUserInfoModel; // 传值
[self.navigationController pushViewController:ownerPersonalInformationVC animated:YES];

**

第二种方法

**
简单封装下 避免重复写storyboardName 和 identifieri 如果项目很多storyboard的话 写字符串也很烦的,有时候会出错,就简单封装了下。
写一个NSObject的分类 下面是.m .h文件

//
//  NSObject+PushNextControllerTool.h
//  LiBa
//
//  Created by GongHui_YJ on 2016/11/2.
//  Copyright © 2016年 LiBa. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSObject (PushNextControllerTool)

typedef enum  {
    LoginRegisterStoryBoard = 0, // 登录注册
    OwnerMainStoryBoard, // 业主Mian
    OwnerHomeStoryBoard, // 业主Home
    OwnerMaterialStoryBoard, // 业主材料
    OwnerBillingStoryBoard, // 业主订单状态
    OwnerMineStoryBoard, // 业主个人
    OwnerOrderStoryBoard, // 业主订单
    WorkerMainStoryBoard, // 工人Mian
    WorkerHomeStoryBoard, // 工人Home
    WorkerWelfareStoryBoard, // 工人福利
    WorkerMineStoryBoard // 工人Mine
}StoryBoardNameStute;


/**
 通过UINavigationController进行界面的跳转

 @param selfController      自己的现在的界面的控制器 即self  传入self
 @param storyBoardNameStute 要跳转的界面所在的StoryBoardStute状态 枚举
 @param identifier          要跳转的界面在storyBoard中的控制器的标识符

 @return 返回下个的控制器
 */
+ (UIViewController *)pushWithSelfController:(UIViewController *)selfController NextViewControlerWithStorbordNameStute:(StoryBoardNameStute)storyBoardNameStute withControllerIdentifier:(NSString *)identifier;


@end
//
//  NSObject+PushNextControllerTool.m
//  LiBa
//
//  Created by GongHui_YJ on 2016/11/2.
//  Copyright © 2016年 LiBa. All rights reserved.
//

#import "NSObject+PushNextControllerTool.h"
@implementation NSObject (PushNextControllerTool)


/**
 通过UINavigationController进行界面的跳转

 @param selfController      自己的现在的界面的控制器 即self  传入self
 @param storyBoardNameStute 要跳转的界面所在的StoryBoardStute状态 枚举
 @param identifier          要跳转的界面在storyBoard中的控制器的标识符

 @return 返回下个的控制器
 */
+ (UIViewController *)pushWithSelfController:(UIViewController *)selfController NextViewControlerWithStorbordNameStute:(StoryBoardNameStute)storyBoardNameStute withControllerIdentifier:(NSString *)identifier
{

    UIStoryboard *MicroCourseLiveStoryBoard = [UIStoryboard storyboardWithName:[self accordingToEnumGetStoryBoardNameWithStoryBoardNameStute:storyBoardNameStute] bundle:nil];
    UIViewController *nextPageController  = [MicroCourseLiveStoryBoard instantiateViewControllerWithIdentifier:identifier];
    selfController.hidesBottomBarWhenPushed = YES;
    [selfController.navigationController pushViewController:nextPageController animated:YES];
    return nextPageController;
}


/**
 获取StoryBoard名称

 @param storyBoardName storyBoard名称

 @return 返回一个字符串
 */
+ (NSString *)accordingToEnumGetStoryBoardNameWithStoryBoardNameStute:(StoryBoardNameStute)storyBoardNameStute {

    switch (storyBoardNameStute) {
        case LoginRegisterStoryBoard:
            return @"LoginRegister";
        case OwnerMainStoryBoard:
            return @"OwnerMain";
        case OwnerHomeStoryBoard:
            return @"OwnerHome";
        case OwnerBillingStoryBoard:
            return @"OwnerBilling";
        case OwnerMaterialStoryBoard:
            return @" OwnerMaterial";
        case OwnerOrderStoryBoard:
            return @"OwnerOrder";
        case OwnerMineStoryBoard:
            return @"OwnerMine";
        case WorkerMainStoryBoard:
            return @"WorkerMain";
        case WorkerHomeStoryBoard:
            return @"WorkerHome";
        case WorkerWelfareStoryBoard:
            return @"WorkerWelfare";
        case WorkerMineStoryBoard:
            return @"WorkerMine";
        default:
            return @"";
    }
    return nil;
}


@end

VC中使用

OwnerPersonalInformationViewController *ownerPersonalInformationVC = (OwnerPersonalInformationViewController *)[UIViewController pushWithSelfController:self NextViewControlerWithStorbordNameStute:OwnerMineStoryBoard withControllerIdentifier:@"OwnerPersonalInformationViewController"];
// 这边传值的这样
ownerPersonalInformationVC.ownerUserInfoModel = self.ownerUserInfoModel;

OK 第二种方法搞定

第三种方法:

避免重复写storyboradName 和 identifier 我就很烦一直写这个两个··重复代码很多
封装比较全面 写一个UIViewController分类

//
//  UIViewController+Storyboard.h
//  LiBa
//
//  Created by GongHui_YJ on 2016/11/2.
//  Copyright © 2016年 LiBa. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UIViewController (Storyboard)


/**
 获取控制器

 @return 返回一个控制器
 */
+ (nullable instancetype)instanceFromStoryboard;

@end
//
//  UIViewController+Storyboard.m
//  LiBa
//
//  Created by GongHui_YJ on 2016/11/2.
//  Copyright © 2016年 LiBa. All rights reserved.
//

#import "UIViewController+Storyboard.h"

@implementation UIViewController (Storyboard)

+ (nullable instancetype)instanceFromStoryboard
{
    NSString *identifier = NSStringFromClass([self class]);

    // 取缓存的storyboard名
    NSCache *cache = [self cache];
    NSString *cacheStoryboardName = [cache objectForKey:identifier];
    if (cacheStoryboardName) {
        return [self tryTakeOutInstanceFromStoryboardNamed:cacheStoryboardName identifier:identifier];
    }

    // 未缓存,遍历storyboard文件名列表,开始尝试取出实例。
    for (NSString *name in [self storyboardList]) {
        UIViewController *instance = [self tryTakeOutInstanceFromStoryboardNamed:name identifier:identifier];
        if (instance) {
            // 成功获取实例后,对storyboard名进行缓存
            [cache setObject:name forKey:identifier];
            return instance;
        }
    }
    return nil;
}

/**
 获取所有storyboard文件·

 @return
 */
+ (nonnull NSArray*)storyboardList
{
    static NSArray *kBundleStoryboardNameList;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSMutableArray *tmp = [NSMutableArray array];

        /**
         *  找到所有storyboard文件。
         *  @warning 会忽略带有 ~iphone(iPhone应用)或 ~ipad(ipad应用)标志的 storyboard文件名
         */
        NSArray *list = [NSBundle pathsForResourcesOfType:@"storyboardc" inDirectory:[NSBundle mainBundle].resourcePath];
        for (NSString *path in list) {
            NSString *ext = [path lastPathComponent];
            NSString *name = [ext stringByDeletingPathExtension];
            if ([name rangeOfString:@"~"].location == NSNotFound) {

                [tmp addObject:name];
            }
        }

        kBundleStoryboardNameList = [NSArray arrayWithArray:tmp];
    });
    return kBundleStoryboardNameList;
}


/**
 获取vc

 @param storyboardName stotyboardname
 @param identifier     identifier

 @return vc
 */
+ (nullable instancetype)tryTakeOutInstanceFromStoryboardNamed:(nonnull NSString *)storyboardName identifier:(nonnull NSString *)identifier
{
    if (!storyboardName || !identifier) {
        return nil;
    }

    @try {
        UIStoryboard *sb = [UIStoryboard storyboardWithName:storyboardName bundle:[NSBundle mainBundle]];
        UIViewController *vc = [sb instantiateViewControllerWithIdentifier:identifier];
        return vc;
    }
    @catch (NSException *exception) {
        return nil;
    }
    @finally {

    }  
}

/**
 缓存

 @return
 */
+ (NSCache *)cache
{
    static NSCache *cache;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        cache = [[NSCache alloc] init];
    });
    return cache;
}

@end

VC中是使用

 // 方法一 避免重复写storyborad 和 identifier
    OwnerPersonalInformationViewController *ownerPersonalInformationVC = [OwnerPersonalInformationViewController instanceFromStoryboard];
    ownerPersonalInformationVC.ownerUserInfoModel = self.ownerUserInfoModel; // 传值
    [self.navigationController pushViewController:ownerPersonalInformationVC animated:YES];

反正我讨厌第一种方法··繁琐麻烦, 喜欢第三种,可以少写很多代码,也比较通用,第二种方法需要自己添加一种storyboardName

参考博客
http://www.jianshu.com/p/76037034f5a9

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

建古

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值