UIStoryboard的简单封装

Posted 建古

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于UIStoryboard的简单封装的主要内容,如果未能解决你的问题,请参考以下文章

没了ipad的周末,看看檀悦小业主创造了什么?

Swift-UIStoryboard & Xib 实时设置控件圆角边框阴影

Swift-UIStoryboard & Xib 实时设置控件圆角边框阴影

是否可以在不同的 UIStoryBoard 的 UIViewController 中使用 UIStoryBoard?

C++编程题 关于 继承和多态 的

当代中国社会划分为十大阶层