UIStoryboard的简单封装

来源:互联网 发布:c 高级编程视频教程 编辑:程序博客网 时间:2024/06/05 23:58

在项目中很多人使用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

0 0
原创粉丝点击