如何搭建iOS项目基本框架
今天我们来谈谈如何搭建框架,框架需要做一些什么。
第一步:找到我们的目标
我们的目标是让其他开发人员拿到手后即可写页面,不再需要考虑其他的问题。
第二步:我们需要做哪些东西
各位跟着我一步一步来进行。
假定我们即将要写的项目是一个tabbar+navgation的项目结构。
1. 新建工程
1.1 删除不必要类目
选择Single ViewApplication,命名为HomeHome
删除选中的三项。
1.2 修改info.plist
1.删除info.plist main.storyboard字段
2.添加字段
info.plist 中添加以下
Bundle display name --- 对应应用名
开启http访问,不添加该字段导致不能访问http,只能访问https。
3.添加应用白名单
iOS9之后分享等必须添加白名单后才可以打开相关应用。字段值为LSApplicationQueriesSchemes
- 添加URL Types
用于分享到QQ,微信等平台或者打开支付宝等,已经设置当前APP的Url shesmes
1.3 修改项目配置
- 关闭bitCode
build setting中搜索bitCode 改为NO
2.配置项目
2.1 建立目录
2.2 拖入各大依赖库
我在这里主要依赖了以下库:
AFNetWorking 网络请求
SDWebImage 图片加载
MWPhotoBrowser 图片浏览器
MJRefresh 刷新加载控件
RDVTabBarController 一个很好用的tabbar控件
MBProgressHUD 菊花转圈
NJKWebViewProgress webview的加载进度条
Masonry 用于适配
2.3 依赖常用第三方服务
通常集成了:
均根据官方文档安装
3. 编写代码
3.1 建立pch
3.1 建立Api.h文件
该声明文件用于查询接口等
3.2 建立Config.h文件
该声明文件用于编写某些全局配置参数
如以下:
#define kPushPhotoBrowserNotifitationName @"PushPhotoBrowser"
#define kPresentVideoPlayerNotifitationName @"playCallBackVideo"
#define APPICONIMAGE [UIImage imageNamed:[[[[NSBundle mainBundle] infoDictionary] valueForKeyPath:@"CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles"] lastObject]]
#define APPNAME [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"]
#define Main_Color [UIColor colorWithRed:(3)/255.0 green:(160)/255.0 blue:(235)/255.0 alpha:1.0]
#define Main2_Color [UIColor colorWithRed:(135)/255.0 green:(202)/255.0 blue:(231)/255.0 alpha:1.0]
#define VTColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
#define Text_Color [UIColor colorWithRed:(51)/255.0 green:(71)/255.0 blue:(113)/255.0 alpha:1.0]
#define BackGround_Color [UIColor colorWithRed:(235)/255.0 green:(235)/255.0 blue:(241)/255.0 alpha:1.0]
#define Default_Person_Image [UIImage imageNamed:@"default_parents"]
#define Default_General_Image [UIImage imageNamed:@"default_general"]
#define kScreenW [UIScreen mainScreen].bounds.size.width
#define kScreenH [UIScreen mainScreen].bounds.size.height
//以及各种第三方服务商的appId或者App key
3.3 开始编写项目结构
我们分别建立了3个AppDelegate的类别
HHAppDelegate+AppService //app的服务管理
HHAppDelegate+AppLifeCircle//app的生命周期管理
HHAppDelegate+RootController//app的跟视图控制器实例
先看看HHAppDelegate+RootController
声明文件
/**
* 首次启动轮播图
*/
- (void)createLoadingScrollView;
/**
* tabbar实例
*/
- (void)setTabbarController;
/**
* window实例
*/
- (void)setAppWindows;
/**
* 设置根视图
*/
- (void)setRootViewController;
实现:
- (void)setRoot
{
UINavigationController * navc = [[UINavigationController alloc] initWithRootViewController:self.viewController];
navc.navigationBar.barTintColor = Main_Color;
navc.navigationBar.shadowImage = [[UIImage alloc] init];
[navc.navigationBar setTranslucent:NO];
[[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[navc.navigationBar setTitleTextAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:19],NSForegroundColorAttributeName:[UIColor whiteColor]}];
navc.navigationBar.tintColor = [UIColor whiteColor];
self.window.rootViewController = navc;
}
- (void)setTabbarController
{
HomePageViewController *school = [[HomePageViewController alloc]init];
AboutChildViewController *child = [[AboutChildViewController alloc]init];
CommuntiyViewController *edu = [[CommuntiyViewController alloc]init];
SZCourseListViewController *courseList = [[SZCourseListViewController alloc]init];
AboutMeViewController *about = [[AboutMeViewController alloc]init];
RDVTabBarController *tabBarController = [[RDVTabBarController alloc] init];
[tabBarController setViewControllers:@[school,edu,child,courseList,about]];
self.viewController = tabBarController;
tabBarController.delegate = self;
[self customizeTabBarForController:tabBarController];
}
- (void)setAppWindows
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[[UIApplication sharedApplication]setStatusBarHidden:NO];
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
[[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]}];
}
- (void)createLoadingScrollView
{
//引导页实例
}
注意:这里将Navgation作为根视图控制器,tabbar作为Navgation的rootViewController。
如此全局只有一个跟导航控制器。页面Controller与Tabbar处于平级状态。这与接下来我们弹出各种页面均由关联
自此一个大致的结构就出来了,一个Tabbar+Navgation的格式
3.4 编写AppService
这类信息大都跟需求有关,我们在这里处理项目相关信息。如可能会由以下信息
- (void)registerBugly;
/**
* 基本配置
*/
- (void)configurationLaunchUserOption;
/**
* 友盟注册
*/
- (void)registerUmeng;
/**
* Mob注册
*/
- (void)registerMob;
/**
* 检查更新
*/
- (void)checkAppUpDataWithshowOption:(BOOL)showOption;
/**
* 上传用户设备信息
*/
- (void)upLoadMessageAboutUser;
/**
* 检查黑名单用户
*/
-(void)checkBlack;
3.5 App结构整理
以上我们处理了跟视图,服务,app声明周期等方法实现
现在我们开始调用这些方法。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self setAppWindows];
[self setTabbarController];
[self setRootViewController];
[self configurationLaunchUserOption];
[self registerBugly];
[self registerMob];
[self registerUmeng];
[VTJpushTools setupWithOptions:launchOptions];
[self upLoadMessageAboutUser];
[self checkAppUpDataWithshowOption:NO];
[SZNotificationCenter addObserver:self selector:@selector(phontoBroserPush:) name:kPushPhotoBrowserNotifitationName object:nil];
[SZNotificationCenter addObserver:self selector:@selector(playCallBackVideo:) name:kPresentVideoPlayerNotifitationName object:nil];
[self.window makeKeyAndVisible];
return YES;
}
好了,我们着重说一下这里两个通知。
分别是收到图片查看的通知、视频播放的通知
这里以查看图片举列。我们认为查看图片是push到一个新页面中去。
因此我们需要找到导航控制器
根据之前所说,当前结构中只有一个导航控制器就是Root
+ (UINavigationController *)rootNavigationController
{
HHAppDelegate *app = (HHAppDelegate *)[UIApplication sharedApplication].delegate;
return (UINavigationController *)app.window.rootViewController;
}
找到控制器后就变得简单的多了。
我们开始实现:
这里我们对传来的数据格式由一定要求,类似于这样的一个格式。
@{@"imageInfo":@[HHImageInfo*info,HHImageInfo *info2],@"index":@3};
原因:图片一般有高清图片和非高清图片两种格式。以及图片有可能带有文字描述。因此引入ImageInfo。
- (void)phontoBroserPush:(NSNotification *)note
{
self.imageArr = [NSMutableArray arrayWithCapacity:0];
[self.imageArr removeAllObjects];
NSDictionary *dic = note.object;
NSArray *arr = dic[@"imageInfo"];
NSInteger index = [dic[@"index"] integerValue];
self.imageIndex = index;
for(HHImageInfo *info in arr)
{
//[self.imageArr addObject:info.url];
MWPhoto *photo = [MWPhoto photoWithURL:[NSURL URLWithString:info.url]];
photo.caption = info.desc;
[self.imageArr addObject:photo];
}
MWPhotoBrowser *browser = [[MWPhotoBrowser alloc]initWithDelegate:self];
browser.zoomPhotosToFill = YES;
browser.displayNavArrows = YES;
browser.displayActionButton = NO;
browser.alwaysShowControls = NO;
browser.autoPlayOnAppear = YES;
[browser setCurrentPhotoIndex:index];
[[HHAppDelegate rootNavigationController]pushViewController:browser animated:YES];
}
到这里,其他开发人员在进行模块开发的时候需要图片浏览器的时候直接发送通知即可集成。
HHImageInfo中
@property (nonatomic,strong)NSString *desc;
@property (nonatomic,strong)NSString *url;
//@property (nonatomic,assign)NSInteger imageIndex;
+ (NSString *)getHUDImageUrl:(NSString *)smallImageUrl;
实现:
+ (NSString *)getHUDImageUrl:(NSString *)smallImageUrl
{
NSMutableString *str = [NSMutableString stringWithString:smallImageUrl];
NSRange substr = [str rangeOfString:@"_thu"];
while (substr.location != NSNotFound)
{
[str replaceCharactersInRange:substr withString:@""];
substr = [str rangeOfString:@"_thu"];
}
[str insertString:@"" atIndex:0];
return str;
}
4. 其他配置
4.1 rootViewController -- 所有页面均继承该控制器
我通常在RootViewController实现以下方法以供调用
/**
* 显示没有数据页面
*/
-(void)showNoDataImage;
/**
* 移除无数据页面
*/
-(void)removeNoDataImage;
/**
* 需要登录
*/
- (void)showShouldLoginPoint;
/**
* 加载视图
*/
- (void)showLoadingAnimation;
/**
* 停止加载
*/
- (void)stopLoadingAnimation;
/**
* 分享页面
*
* @param url url
* @param title 标题
*/
- (void)shareUrl:(NSString *)url andTitle:(NSString *)title;
- (void)goLogin;
/**
* 状态栏
*/
- (void)initStatusBar;
- (void)showStatusBarWithTitle:(NSString *)title;
- (void)changeStatusBarTitle:(NSString *)title;
- (void)hiddenStatusBar;
具体实现方法请看demo
Demo下载
有点乱七八糟,但是你明白我的意思对不?
2016.04.29
- 关于中文文件夹:咱们提倡使用英文。但是不反对中文.
楼主认为所有便于开发的操作都是可以允许的。
我接手过那么几个项目,内部蹩脚(或高端)的英文让我猝不及防。我多想他用的是拼音我就不会理解的那么困难了。
- 关于pod:demo只是提供了一种思路与步骤,仅做参考。继承第三方库方式就看个人了。
- 关于stroyboad:不利于团队开发。
如何搭建iOS项目基本框架的更多相关文章
- 手把手教你如何搭建iOS项目基本框架
手把手教你如何搭建iOS项目基本框架 今天我们来谈谈如何搭建框架,框架需要做一些什么. 第一步:找到我们的目标我们的目标是让其他开发人员拿到手后即可写页面,不再需要考虑其他的问题. 第二步:我们需要做 ...
- iOS项目——基本框架搭建
项目开发过程中,在完成iOS项目——项目开发环境搭建之后,我们首先需要考虑的就是我们的项目的整体框架与导航架构设计,然后在这个基础上考虑功能模块的完成. 一 导航架构设计 一款App的导航架构设计应该 ...
- SpringMVC Memcached 搭建WEB项目缓存框架
最近做的项目一直在使用memcached作为缓存来缓存各种数据,现在BOSS要在项目上加上缓存.并把任务交给我.便琢磨怎么解决这个问题. 看了很多文章,写的比较详尽靠谱的就是这篇了http://www ...
- iOS项目——自定义UITabBar与布局
在上一篇文章iOS项目——基本框架搭建中,我们详细说明了如何对TabBarItem的图片属性以及文字属性进行一些自定义配置.但是,很多时候,我们需要修改TabBarItem的图片和文字属性之外,还需要 ...
- 使用Koa2搭建web项目
随着Node.js的日益火热,各种框架开始层出不穷的涌现出来,Node.js也开始逐渐的被应用到处理服务端请求的场景中.搭建Web项目的框架也随之开始出现——express.koa.koa2.egg等 ...
- iOS项目——项目开发环境搭建
在开发项目之前,我们需要做一些准备工作,了解iOS扩展--Objective-C开发编程规范是进行开发的必备基础,学习iOS学习--Xcode9上传项目到GitHub是我们进行版本控制和代码管理的选择 ...
- iOS 从0到1搭建高可用App框架
iOS 从0到1搭建高可用App框架 最近在搭建新项目的iOS框架,一直在思考如何才能搭建出高可用App框架,能否避免后期因为代码质量问题的重构.以前接手过许多“烂代码”,架构松散,底层混乱,缺少规范 ...
- uniapp之uni-starter小程序多端研发框架搭建与项目实践
随着移动互联网的飞速发展,无数移动APP琳琅满目:在移动App的发展的基础上,衍生了小程序.轻应用技术,它随时可用,但又无需安装卸载.小程序是一种不需要下载安装即可使用的应用,它实现了应用" ...
- 一步一步使用ABP框架搭建正式项目系列教程之本地化详解
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 扯扯本地化 ABP中的本地化 小结 扯扯本地化 本节来说说本地化,也有叫国际化.全球化的,不管怎么个叫法,反正道理都是一 ...
随机推荐
- 【Spring】Spring框架如何集成Hibernate框架
下面个整理一下hibernate和Spring框架的结合. 首先是引入hibernate框架的包.Spring框架的包.数据库驱动包. User.java文件 package cn.shop.bean ...
- Postgresql 正则表达式
在postgresql中使用正则表达式时需要使用关键字“~”,以表示该关键字之前的内容需匹配之后的正则表达式,若匹配规则不需要区分大小写,可以使用组合关键字“~*”: 相反,若需要查询不匹配这则表达式 ...
- NoSQL 非关系数据库
NoSQL 数据库的学习 Redis的Windows版本安装 待整理 redis 安装 关于分布式的网站介绍 NOSQL 几个网页 认识MongoDB Mongodb实现副本集和Mongodb副本集的 ...
- Python读文本文件中文乱问题
file_object = open('thefile.txt')try: all_the_text = file_object.read().decode("gb2312")fi ...
- 【iOS开发-36】Bundle Identifier的中文字符变成-的问题
在创建新项目时,Bundle Identifier=Organization Identifier+Product Name.可是它们对中文的识别统一变成短横线 - . 所以在创建多个项目的时候,须要 ...
- [转]Greenplum 资源隔离的原理与源码分析
摘要: 背景 Greenplum是一个MPP的数据仓库系统,最大的优点是水平扩展,并且一个QUERY就能将硬件资源的能力发挥到极致. 但这也是被一些用户诟病的一点,因为一个的QUERY就可能占光所有的 ...
- xpath的常见操作
1. 获取某一个节点下所有的文本数据: data = response.xpath('//div[@id="zoomcon"]') content = ''.join(data.x ...
- MySql(十三):MySql架构设计——可扩展性设计之 MySQL Replication
一.前言 MySQL Replication能够将一个 MySQL Server 的 Instance 中的数据完整的复制到另外一个 MySQL Server 的 Instance 中.虽然复制过程并 ...
- Ingress 原理及实例
什么是Ingress 在Kubernetes中,Service和Pod的IP地址只能在集群内部网络中路由,所有到达“边界路由器”(Edge Router)的网络流量要么被丢弃,要么被转发到别处,从概念 ...
- ios获取文件的MD5值
一般我们在使用http或者socket上传或者下载文件的时候,经常会在完成之后经行一次MD5值得校验(尤其是在断点续传的时候用的更 多),校验MD5值是为了防止在传输的过程当中丢包或者数据包被篡改,在 ...