## 简介 本章主要是对项目结构目录及功能模块的介绍 下图为 App 的目录结构如图: ![](http://outiw4np3.bkt.clouddn.com/bffb4a97d32b9a87d4007ec1f49d10f0.jpg) #### 1、AppDelegate 本目录下存放着`AppDelegate`类,用于相应App的各种系统级代理事件 #### 2、Modules目录(功能模块) ![](http://outiw4np3.bkt.clouddn.com/ab8a6bf2450dc608b6e784761ae229ec.jpg) 这一部分是App的界面及逻辑处理部分,采用了MVC的设计模式,`控制器`负责逻辑处理,`模型`传递数据,`视图`展示数据并接受用户的交互事件,所以每个功能模块下都有`Controller`、`View`和`Model`的目录结构。 #### 3、Lib目录(第三方库) 项目中集成第三方库使用了两个方式: * 使用 `CocoaPods` 管理第三方库,简单使用请去[这里](https://www.jianshu.com/p/9e4e36ba8574)。 * 手动集成 所有第三方库在项目中会有两个位置: * `Classes` 目录下的 `Lib` 目录 * `Pods` 工程下 以下是使用`CocoaPods` 集成的第三方库: * `AFNetworking`(用于网络请求) * `MJExtension` (用于json数据转模型) * `SDWebImage`(用于图片下载) * `MJRefresh`(用于上拉刷新下拉加载) * `MBProgressHUD`(HUD过场动画或提示) * `IQKeyboardManager`(统一管理键盘) * `Masonry`(AutoLayout的封装) * `XXNibBridge`(xib动态桥接) * `SDCycleScrollView`(用于图片轮播图) * `ShareSDK3`(用于第三方登录及分享) * `LBXScan`(用于扫描二维码) 以下是手动集成的第三方库: * `OpenIM`(用于收发用户消息) * `BoPhotoPicker`(用于选择图片或拍照) * `ESPictureBrowser`(用于浏览图片) * `Alipay`(支付宝支付) * `WeChatPay`(微信支付及分享) * `SGPagingView`(页面分页效果) #### 4、Expand目录(自定义控件及扩展) 在Expand目录下分为以下小目录: 1. Category 系统类的分类扩展,提供更加简单实用的接口。 2. Network `SJHttpHelper` 对 `AFNetworking` 的封装,提供了 `GET` / `POST` / `UPLOAD` 接口。 使用示例: ```objc NSMutableDictionary *param = [NSMutableDictionary dictionary]; param[@"type"] = type; // GET请求 [SJHttpHelper GET:API_SlideInfo Parameters:param Success:^(SJRespondModel *respondModel) { // 此处写网络请求成功的代码逻辑 } Failure:^(NSError *error) { // 此处写网络请求失败的代码逻辑 }]; // POST请求 [SJHttpHelper POST:API_SlideInfo Animated:YES Parameters:param Success:^(SJRespondModel *respondModel) { // 此处写网络请求成功的代码逻辑 } Failure:^(NSError *error) { // 此处写网络请求失败的代码逻辑 }]; // 上传附件请求 [SJHttpHelper uploadToServersUrl: API_SlideInfo ImageDic:tempDict Parameters: param Success:^(SJRespondModel *respondModel) { // 此处写网络请求成功的代码逻辑 } Failure:^(NSError *error) { // 此处写网络请求失败的代码逻辑 }]; ``` `SJHttpHelper` 的分类提供了App的所有网络请求接口的封装。例如: ```objc @interface SJHttpHelper (Home) /** 首页广告 @param callBolck data数据结构为@[ @{@"ad_file":xxx,@"ad_url":xxx}, @{@"ad_file":xxx,@"ad_url":xxx} ] */ + (void)getSliderdvertWithCallBlock:(void (^)(id data))callBolck; /** 首页热门信息 @param callBolck 返回一个服务模型的数组 */ + (void)getHotServerWithCallBlock:(void (^)(NSArray<SJServerModel *> *models))callBolck; @end ``` 3. Handle 提供了用于地区数据、行业分类、版本检测、获取相册图片、第三方登录及分享、友盟统计和搜索历史的处理类 * `SJAddressHandle` 用于获取地区数据及数据处理 * `SJSectorHandler` 用于获取行业分类及数据处理 * `SJCheckVersionHandle` 用于检查版本更新 ```objc // 检查版本 [[SJCheckVersionHandle sharedInstance] checkVersion]; ``` * `SHTakePhotoHandle` 对 `BoPhotoPicker` 进行了二次封装,提供更加简单的接口选取图片 ```objc // 选取用户头像 [SJTakePhotoHandle takePhotoWithImageBlock:^(UIImage *image) { LKAvatarViewController *vc = [LKAvatarViewController new]; vc.delegate = weakself; vc.imageOriginal = image; vc.sizeClip = CGSizeMake(SJScreenW/2, SJScreenW/2); vc.isCircle = YES; [self.navigationController pushViewController:vc animated:YES]; } ViewController:self]; ``` * `SJSearchHistroyHandle` 用于搜索历史数据处理 * `SJAppHandle` 用于处理用户身份的切换 * `SJThirdLoginHandle` 封装了第三方登录及分享的功能,提供更加简单的方法。例如初始化ShareSDK: ```objc // 注册第三方登录 [SJThirdLoginHandle regsiterShareSDK]; ``` 第三方登录 ```objc /** qq登录 @param success 成功回调 @param failure 失败回调 */ + (void) loginQQSuccess:(void (^)(SSDKUser *user))success Failure:(void (^)(NSError *error))failure; /** 微博登陆 @param success 成功回调 @param failure 失败回调 */ + (void)loginSinaWeiboSuccess:(void (^)(SSDKUser *user))success Failure:(void (^)(NSError *error))failure; /** 微信登录 @param success 成功回调 @param failure 失败回调 */ + (void)loginWechatSuccess:(void (^)(SSDKUser *user))success Failure:(void (^)(NSError *error))failure ``` 分享 ```objc /** 分享 @param shareModel 分享内容模型 @param shareType 分享类型 */ + (void)shareContent:(SJShareModel *)shareModel ToThirdPartyType:(SHARE_TYPE)shareType; ``` * `SJUMengHandle` 简单封装了友盟统计,提供以下方法 ```objc /** 注册友盟统计SDK */ + (void)registerUMeng; /** 进入页面的viewDidAppear:中调用 @param pageName 页面名称 */ + (void)intoPage:(NSString *)pageName; /** 退出页面的viewWillDisAppear:中调用 @param pageName 页面名称 */ + (void)outPage:(NSString *)pageName; ``` 4. Macro * `SJURL` 定义了大量App网络请求的API * `LibMarco` 第三方配置账号 * `UtilsMarco` App开发调试或工具宏定义 * `CommonMarco` 全局定义的常量 5. SJTool 一些自定义的UI类或工具类 * `SJDataArryManager`,一个列表数据的分页管理工具 * `SJPickerView`,一个封装的底部弹出UIPickerView的选择框。 * `SJGetCodeButton`,一个封装的倒计时按钮。 * `SJAttachmentView`,传入多个附件模型,展示或下载附件 * `SJComposePhotoView`,展示或选择图片的控件 * `SJUpButton`,一个图片在上文字在下的按钮 * `SJTopToast`,用于在导航栏下的文字提示Toast 6. User 此目录中存放了用户模型 #### 5、 Resource ![](http://outiw4np3.bkt.clouddn.com/f1423f088a9e87be220efe70cdbcd741.jpg)