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的简单封装的主要内容,如果未能解决你的问题,请参考以下文章
Swift-UIStoryboard & Xib 实时设置控件圆角边框阴影
Swift-UIStoryboard & Xib 实时设置控件圆角边框阴影