今天我们来谈谈如何搭建框架,框架需要做一些什么。

第一步:找到我们的目标
我们的目标是让其他开发人员拿到手后即可写页面,不再需要考虑其他的问题。


第二步:我们需要做哪些东西
各位跟着我一步一步来进行。

假定我们即将要写的项目是一个tabbar+navgation的项目结构。

1. 新建工程

1.1 删除不必要类目

选择Single ViewApplication,命名为HomeHome
删除选中的三项。


删除选中的三项

1.2 修改info.plist

1.删除info.plist main.storyboard字段


main.storyboard

2.添加字段
info.plist 中添加以下
Bundle display name --- 对应应用名
开启http访问,不添加该字段导致不能访问http,只能访问https。


开启http

3.添加应用白名单
iOS9之后分享等必须添加白名单后才可以打开相关应用。字段值为LSApplicationQueriesSchemes

  1. 添加URL Types
    用于分享到QQ,微信等平台或者打开支付宝等,已经设置当前APP的Url shesmes

1.3 修改项目配置

  1. 关闭bitCode
    build setting中搜索bitCode 改为NO

2.配置项目

2.1 建立目录


项目目录

2.2 拖入各大依赖库

我在这里主要依赖了以下库:

AFNetWorking 网络请求
SDWebImage 图片加载
MWPhotoBrowser 图片浏览器
MJRefresh 刷新加载控件
RDVTabBarController 一个很好用的tabbar控件
MBProgressHUD 菊花转圈
NJKWebViewProgress webview的加载进度条
Masonry 用于适配

2.3 依赖常用第三方服务

通常集成了:

友盟分享
极光推送
腾讯bugly
Mob验证码服务

均根据官方文档安装

3. 编写代码

3.1 建立pch

xcode6之后建立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:不利于团队开发。
    好吧我承认我不会stroyboard和xib。不要打脸...

文/五阿哥永琪(简书作者)
原文链接:http://www.jianshu.com/p/0c6f3f4b3b34
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

简单搭建iOS开发项目框架的更多相关文章

  1. 使用Jenkins搭建iOS开发的CI服务器

    目录 简介     下载并运行     Jenkins配置         安装git插件         E-mail设置     自动化构建         远程仓库设置         触发条件 ...

  2. Github+yeoman+gulp-angular初始化搭建angularjs前端项目框架

    在上篇文章里面我们说到了Github账号的申请与配置 那么当你有了Github账号并创建了一个自己的Github项目之后,首要的当然是搭建自己的项目框架啦! 本人对自己的定位是web前端狗,常用开发框 ...

  3. 搭建iOS开发环境

    搭建ios开发环境 1.  直接购买Apple公司的电脑,如MacBook笔记本电脑,默认自带了Mac OS X操作系统. 2.下载安装Xcode和SDK     登录https://develope ...

  4. iOS 从零到一搭建组件化项目框架

    随着公司业务需求的不断迭代发展,工程的代码量和业务逻辑也越来越多,原始的开发模式和架构已经无法满足我们的业务发展速度了,这时我们就需要将原始项目进行一次重构大手术了.这时我们应该很清晰这次手术的动刀口 ...

  5. Cocoapods组件化之搭建组件化项目框架

    一,概述 随着公司业务需求的不断迭代发展,工程的代码量和业务逻辑也越来越多,原始的开发模式和架构已经无法满足我们的业务发展速度了,这时我们就需要将原始项目进行一次重构大手术了.这时我们应该很清晰这次手 ...

  6. iOS开发项目之MVC与MVVM

    MVC MVC,Model-View-Controller,我们从这个古老而经典的设计模式入手.采用 MVC 这个架构的最大的优点在于其概念简单,易于理解,几乎任何一个程序员都会有所了解,几乎每一所计 ...

  7. iOS开发UIKit框架-可视化编程-XIB

    1. Interface Builder 可视化编程 1> 概述 GUI : 图形用户界面(Graphical User Interface, 简称GUI, 又称图形化界面) 是指采用图形方式显 ...

  8. 基于mpvue搭建小程序项目框架

    简介: mpvue框架对于从没有接触过小程序又要尝试小程序开发的人员来说,无疑是目前最好的选择.mpvue从底层支持 Vue.js 语法和构建工具体系,同时再结合相关UI组件库,便可以高效的实现小程序 ...

  9. Windows下搭建IOS开发环境(一)

    原文:http://blog.csdn.net/shangyuan21/article/details/18153605 我们都知道开发iPhone等ios平台的移动应用时需要使用Mac本,但是Mac ...

随机推荐

  1. [HNOI 2003]消防局的设立

    Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来 连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成 ...

  2. [Codeforces 864B]Polycarp and Letters

    Description Polycarp loves lowercase letters and dislikes uppercase ones. Once he got a string s con ...

  3. bzoj 4894: 天赋

    Description 小明有许多潜在的天赋,他希望学习这些天赋来变得更强.正如许多游戏中一样,小明也有n种潜在的天赋,但有 一些天赋必须是要有前置天赋才能够学习得到的.也就是说,有一些天赋必须是要在 ...

  4. const的一些用法和理解

    首先先说一下const常量的用处,我们知道宏定义#define是没有数据类型的,编译器在编译的时候,不会对宏常量进行类型检查,只进行简单的字符串替换,字符串替换时极易产生意想不到的错误,所以这个时候, ...

  5. Delphi 7中的四种消息框

    Delphi中平常使用的消息框有四种形式,有ShowMessage.MessageDlg.Application.MessageBox.MessageBox.下面来深入了解下这四种形式的实现和使用.1 ...

  6. 解决nodejs中json序列化时Date类型默认为UTC格式

    在nodejs中,json序列化时Date类型时,默认转为UTC格式. 如下图 上面只是一个例子,下面我用一个更具体化的例子来展示一个这个情况,我们在开发WEB项目中,经常用到Express组件, 我 ...

  7. Linux学习之CentOS(一)--CentOS6.5环境搭建

    一.前言 作为一个从事运维工作好几年的老运维来说,linux系统怎能不学呢?所以,这几天自己准备学习一下linux操作系统.废话不多说,直奔主题. 要学linux开发,首先得要安装linux系统吧,这 ...

  8. SQL 收缩数据库日志的几种办法 (2005与2008 略有区别)

    在SQL Server 2000/2005中可以快速压缩日志log文件,通过SQL, 方法一: ---DBTEST 为数据库名,顺序最好别乱.注意:要先截断再清空,最后收缩! backup log D ...

  9. Apache 443端口占用解决方法

    当运行httpd.exe时,出现如下问题 原因是启动Apache会占用443端口,而443被其他程序占用了.我们只需将Apache默认端口443改掉就行.网上搜了一下,说是更改Apache24\con ...

  10. UDP网络编程

    概念: UDP协议(用户数据报协议)是无连接,不可靠的,无序的.速度比较快, UDP协议以数据报作为数据传输的载体 进行数据传输时,首先将传输的数据定义成数据报(Datagram),在数据报中指明数据 ...