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
- UIStoryboard的简单封装
- UIStoryboard的使用
- UIStoryboard
- UIStoryboard
- UIStoryboard
- UIstoryboard
- UIStoryboard
- 如何获得UIStoryboard 的viewcontroller
- UIStoryboard加载子控制器的一个坑
- SQLSERVER简单的封装
- 简单封装的窗口
- Mutex的简单封装
- fusionchart的简单封装
- rapidxml的简单封装
- 简单的Ajax封装
- Curl 简单的封装
- 队列的简单封装
- Button的简单封装
- linux 配置环境变量
- PHPMailer 发送邮件
- iOS开发中使用代码控制横竖屏的切换
- 性能优化1: 能在一个循环内处理的事情,不要分成多个循环
- POJ 1988/bzoj3376[Usaco2004 Open]Cube Stacking 方块游戏
- UIStoryboard的简单封装
- Makefile详解-书写规则
- 2017第一季度计划
- 大数据学习笔记-------------------(30)
- log4j 配置数据库连接池添加自定义信息
- 1102学习记录 扑克牌类实现
- find和grep查找字符串
- 一些运算符号的优先级
- Redis实现分布式锁