HF_Q před 4 roky
rodič
revize
3c95fd5100
100 změnil soubory, kde provedl 25575 přidání a 2984 odebrání
  1. 16 1
      Podfile.lock
  2. 51 0
      Pods/BRPickerView/BRPickerView/AddressPickerView/BRAddressModel.h
  3. 24 0
      Pods/BRPickerView/BRPickerView/AddressPickerView/BRAddressModel.m
  4. 127 0
      Pods/BRPickerView/BRPickerView/AddressPickerView/BRAddressPickerView.h
  5. 600 0
      Pods/BRPickerView/BRPickerView/AddressPickerView/BRAddressPickerView.m
  6. 17 0
      Pods/BRPickerView/BRPickerView/BRPickerView.h
  7. 74 0
      Pods/BRPickerView/BRPickerView/Base/BRBaseView.h
  8. 394 0
      Pods/BRPickerView/BRPickerView/Base/BRBaseView.m
  9. 230 0
      Pods/BRPickerView/BRPickerView/Base/BRPickerStyle.h
  10. 336 0
      Pods/BRPickerView/BRPickerView/Base/BRPickerStyle.m
  11. 13634 0
      Pods/BRPickerView/BRPickerView/Base/BRPickerView.bundle/BRCity.json
  12. 32 0
      Pods/BRPickerView/BRPickerView/Base/BRPickerView.bundle/en.lproj/Localizable.strings
  13. 32 0
      Pods/BRPickerView/BRPickerView/Base/BRPickerView.bundle/zh-Hans.lproj/Localizable.strings
  14. 32 0
      Pods/BRPickerView/BRPickerView/Base/BRPickerView.bundle/zh-Hant.lproj/Localizable.strings
  15. 125 0
      Pods/BRPickerView/BRPickerView/Base/BRPickerViewMacro.h
  16. 29 0
      Pods/BRPickerView/BRPickerView/Base/NSBundle+BRPickerView.h
  17. 80 0
      Pods/BRPickerView/BRPickerView/Base/NSBundle+BRPickerView.m
  18. 97 0
      Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView+BR.h
  19. 635 0
      Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView+BR.m
  20. 223 0
      Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView.h
  21. 1422 0
      Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView.m
  22. 97 0
      Pods/BRPickerView/BRPickerView/DatePickerView/NSDate+BRPickerView.h
  23. 304 0
      Pods/BRPickerView/BRPickerView/DatePickerView/NSDate+BRPickerView.m
  24. 40 0
      Pods/BRPickerView/BRPickerView/StringPickerView/BRResultModel.h
  25. 49 0
      Pods/BRPickerView/BRPickerView/StringPickerView/BRResultModel.m
  26. 191 0
      Pods/BRPickerView/BRPickerView/StringPickerView/BRStringPickerView.h
  27. 621 0
      Pods/BRPickerView/BRPickerView/StringPickerView/BRStringPickerView.m
  28. 21 0
      Pods/BRPickerView/LICENSE
  29. 492 0
      Pods/BRPickerView/README.md
  30. 16 1
      Pods/Manifest.lock
  31. 2806 2495
      Pods/Pods.xcodeproj/project.pbxproj
  32. 60 0
      Pods/Pods.xcodeproj/xcuserdata/niuzhen.xcuserdatad/xcschemes/BRPickerView.xcscheme
  33. 5 0
      Pods/Pods.xcodeproj/xcuserdata/niuzhen.xcuserdatad/xcschemes/xcschememanagement.plist
  34. 26 0
      Pods/Target Support Files/BRPickerView/BRPickerView-Info.plist
  35. 5 0
      Pods/Target Support Files/BRPickerView/BRPickerView-dummy.m
  36. 12 0
      Pods/Target Support Files/BRPickerView/BRPickerView-prefix.pch
  37. 28 0
      Pods/Target Support Files/BRPickerView/BRPickerView-umbrella.h
  38. 6 0
      Pods/Target Support Files/BRPickerView/BRPickerView.modulemap
  39. 9 0
      Pods/Target Support Files/BRPickerView/BRPickerView.xcconfig
  40. 25 0
      Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino-acknowledgements.markdown
  41. 31 0
      Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino-acknowledgements.plist
  42. 1 0
      Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino-frameworks-Debug-input-files.xcfilelist
  43. 1 0
      Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino-frameworks-Debug-output-files.xcfilelist
  44. 1 0
      Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino-frameworks-Release-input-files.xcfilelist
  45. 1 0
      Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino-frameworks-Release-output-files.xcfilelist
  46. 2 0
      Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino-frameworks.sh
  47. 4 4
      Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino.debug.xcconfig
  48. 4 4
      Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino.release.xcconfig
  49. 1 0
      podfile
  50. 56 0
      smartRhino.xcodeproj/project.pbxproj
  51. binární
      smartRhino.xcworkspace/xcuserdata/niuzhen.xcuserdatad/UserInterfaceState.xcuserstate
  52. 6 144
      smartRhino.xcworkspace/xcuserdata/niuzhen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  53. 13 1
      smartRhino/AppConfig.h
  54. 22 0
      smartRhino/Assets.xcassets/comment_star_no.imageset/Contents.json
  55. binární
      smartRhino/Assets.xcassets/comment_star_no.imageset/comment_star_no@2x.png
  56. binární
      smartRhino/Assets.xcassets/comment_star_no.imageset/comment_star_no@3x.png
  57. 22 0
      smartRhino/Assets.xcassets/comment_star_yes.imageset/Contents.json
  58. binární
      smartRhino/Assets.xcassets/comment_star_yes.imageset/comment_star_yes@2x.png
  59. binární
      smartRhino/Assets.xcassets/comment_star_yes.imageset/comment_star_yes@3x.png
  60. 22 0
      smartRhino/Assets.xcassets/comment_unStar.imageset/Contents.json
  61. binární
      smartRhino/Assets.xcassets/comment_unStar.imageset/comment_unStar@2x.png
  62. binární
      smartRhino/Assets.xcassets/comment_unStar.imageset/comment_unStar@3x.png
  63. 18 5
      smartRhino/FwzAppConfig.h
  64. 1 0
      smartRhino/Project/Other/Third/Calender/NSDate+Extension.h
  65. 6 0
      smartRhino/Project/Other/Third/Calender/NSDate+Extension.m
  66. 1 0
      smartRhino/Project/VCModel/ChatMessage/Controller/ChatMsgNotice/Controller/MoveViewController.m
  67. 8 10
      smartRhino/Project/VCModel/ChatMessage/Controller/MailList/Controller/MailChatVC.m
  68. 8 10
      smartRhino/Project/VCModel/ChatMessage/Controller/MailList/Controller/MailGroupListVC.m
  69. 9 10
      smartRhino/Project/VCModel/ChatMessage/Controller/MailList/Controller/MailGroupVC.m
  70. 72 68
      smartRhino/Project/VCModel/ChatMessage/Controller/MyTDGroup/Cell/TDGroupInfoListCell.xib
  71. 3 0
      smartRhino/Project/VCModel/Home/Model/HomeSubItemModel.h
  72. 15 4
      smartRhino/Project/VCModel/Home/VC/BookStore/BookDetail.storyboard
  73. 21 0
      smartRhino/Project/VCModel/Home/VC/BookStore/Model/BookBillListModel.h
  74. 13 0
      smartRhino/Project/VCModel/Home/VC/BookStore/Model/BookBillListModel.m
  75. 1 1
      smartRhino/Project/VCModel/Home/VC/BookStore/Model/BookListenModel.h
  76. 16 2
      smartRhino/Project/VCModel/Home/VC/BookStore/Model/BookMeidaModel.h
  77. 21 0
      smartRhino/Project/VCModel/Home/VC/BookStore/Model/BookProblemModel.h
  78. 13 0
      smartRhino/Project/VCModel/Home/VC/BookStore/Model/BookProblemModel.m
  79. 0 1
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookAllLookVC.h
  80. 28 46
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookAllLookVC.m
  81. 17 0
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookBillBoardSearchVC.h
  82. 236 0
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookBillBoardSearchVC.m
  83. 121 28
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookBillboardVC.m
  84. 83 40
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookContentNavVC.m
  85. 868 48
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookListDetailVC.m
  86. 1 0
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookMingDetailVC.h
  87. 96 17
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookMingDetailVC.m
  88. 17 4
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookMingVC.m
  89. 32 13
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookRead/viewcontroller/BookReadVC.m
  90. 18 0
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSearch/BookGongzhSearchVC.h
  91. 130 0
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSearch/BookGongzhSearchVC.m
  92. 29 16
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSearch/BookLabelAllVC.m
  93. 17 0
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSearch/BookLabelSearchVC.h
  94. 237 0
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSearch/BookLabelSearchVC.m
  95. 17 0
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSearch/BookMingSearchVC.h
  96. 124 0
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSearch/BookMingSearchVC.m
  97. 6 0
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookStoreHome.m
  98. 1 1
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSubArticeVC.h
  99. 61 10
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSubArticeVC.m
  100. 0 0
      smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSubMusicVC.h

+ 16 - 1
Podfile.lock

@@ -14,6 +14,18 @@ PODS:
   - AFNetworking/Serialization (4.0.1)
   - AFNetworking/UIKit (4.0.1):
     - AFNetworking/NSURLSession
+  - BRPickerView (2.7.0):
+    - BRPickerView/AddressPickerView (= 2.7.0)
+    - BRPickerView/Base (= 2.7.0)
+    - BRPickerView/DatePickerView (= 2.7.0)
+    - BRPickerView/StringPickerView (= 2.7.0)
+  - BRPickerView/AddressPickerView (2.7.0):
+    - BRPickerView/Base
+  - BRPickerView/Base (2.7.0)
+  - BRPickerView/DatePickerView (2.7.0):
+    - BRPickerView/Base
+  - BRPickerView/StringPickerView (2.7.0):
+    - BRPickerView/Base
   - FDFullscreenPopGesture (1.1)
   - FLAnimatedImage (1.0.12)
   - FMDB (2.7.5):
@@ -75,6 +87,7 @@ PODS:
 
 DEPENDENCIES:
   - AFNetworking
+  - BRPickerView
   - FDFullscreenPopGesture (= 1.1)
   - FLAnimatedImage
   - FMDB
@@ -104,6 +117,7 @@ DEPENDENCIES:
 SPEC REPOS:
   https://github.com/CocoaPods/Specs.git:
     - AFNetworking
+    - BRPickerView
     - FDFullscreenPopGesture
     - FLAnimatedImage
     - FMDB
@@ -130,6 +144,7 @@ SPEC REPOS:
 
 SPEC CHECKSUMS:
   AFNetworking: 7864c38297c79aaca1500c33288e429c3451fdce
+  BRPickerView: 882991201e8a27b9f41e4b6888d2871418e71f84
   FDFullscreenPopGesture: a8a620179e3d9c40e8e00256dcee1c1a27c6d0f0
   FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31
   FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
@@ -154,6 +169,6 @@ SPEC CHECKSUMS:
   YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30
   ZFPlayer: 8a6021a3c45e281f2abd24dca5c88915af770a7e
 
-PODFILE CHECKSUM: 815247f1ed93cb28b18fdb5bbea62a0dec47f5b4
+PODFILE CHECKSUM: befcc3aac57bf08cb530cb3631624d7f3720df95
 
 COCOAPODS: 1.8.4

+ 51 - 0
Pods/BRPickerView/BRPickerView/AddressPickerView/BRAddressModel.h

@@ -0,0 +1,51 @@
+//
+//  BRAddressModel.h
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2017/8/11.
+//  Copyright © 2017 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// 省
+@interface BRProvinceModel : NSObject
+/** 省对应的code或id */
+@property (nullable, nonatomic, copy) NSString *code;
+/** 省的名称 */
+@property (nullable, nonatomic, copy) NSString *name;
+/** 省的索引 */
+@property (nonatomic, assign) NSInteger index;
+/** 城市数组 */
+@property (nullable, nonatomic, copy) NSArray *citylist;
+
+@end
+
+/// 市
+@interface BRCityModel : NSObject
+/** 市对应的code或id */
+@property (nullable, nonatomic, copy) NSString *code;
+/** 市的名称 */
+@property (nullable, nonatomic, copy) NSString *name;
+/** 市的索引 */
+@property (nonatomic, assign) NSInteger index;
+/** 地区数组 */
+@property (nullable, nonatomic, copy) NSArray *arealist;
+
+@end
+
+/// 区
+@interface BRAreaModel : NSObject
+/** 区对应的code或id */
+@property (nullable, nonatomic, copy) NSString *code;
+/** 区的名称 */
+@property (nullable, nonatomic, copy) NSString *name;
+/** 区的索引 */
+@property (nonatomic, assign) NSInteger index;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 24 - 0
Pods/BRPickerView/BRPickerView/AddressPickerView/BRAddressModel.m

@@ -0,0 +1,24 @@
+//
+//  BRAddressModel.m
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2017/8/11.
+//  Copyright © 2017 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import "BRAddressModel.h"
+
+@implementation BRProvinceModel
+
+@end
+
+
+@implementation BRCityModel
+
+@end
+
+
+@implementation BRAreaModel
+
+@end

+ 127 - 0
Pods/BRPickerView/BRPickerView/AddressPickerView/BRAddressPickerView.h

@@ -0,0 +1,127 @@
+//
+//  BRAddressPickerView.h
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2017/8/11.
+//  Copyright © 2017 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import "BRBaseView.h"
+#import "BRAddressModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// 地址选择器类型
+typedef NS_ENUM(NSInteger, BRAddressPickerMode) {
+    /** 显示【省市区】(默认) */
+    BRAddressPickerModeArea,
+    /** 显示【省市】 */
+    BRAddressPickerModeCity,
+    /** 显示【省】 */
+    BRAddressPickerModeProvince
+};
+
+typedef void(^BRAddressResultBlock)(BRProvinceModel * _Nullable province, BRCityModel * _Nullable city, BRAreaModel * _Nullable area);
+
+@interface BRAddressPickerView : BRBaseView
+
+/**
+ //////////////////////////////////////////////////////////////////////////
+ ///
+ ///   【用法一】
+ ///    特点:灵活,扩展性强(推荐使用!)
+ ///
+ ////////////////////////////////////////////////////////////////////////*/
+
+/** 地址选择器显示类型 */
+@property (nonatomic, assign) BRAddressPickerMode pickerMode;
+
+/** 默认选中的位置(1.传索引数组,如:@[@10, @0, @4]) */
+@property (nullable, nonatomic, copy) NSArray <NSNumber *> *selectIndexs;
+/** 默认选中的位置(2.传值数组,如:@[@"浙江省", @"杭州市", @"西湖区"]) */
+@property (nullable, nonatomic, copy) NSArray <NSString *> *selectValues;
+
+/** 选择结果的回调 */
+@property (nullable, nonatomic, copy) BRAddressResultBlock resultBlock;
+
+/** 滚动选择时触发的回调 */
+@property (nullable, nonatomic, copy) BRAddressResultBlock changeBlock;
+
+/**
+ *  地区数据源(不传或为nil,默认就获取本地 BRCity.json 文件的数据)
+ *  1.可以传 JSON数组,要注意 层级结构 和 key 要与 BRCity.json 保持一致
+ *  2.可以传 模型数组(NSArray <BRProvinceModel *> * 类型),自己解析数据源 只需要注意层级结构就行
+ */
+@property (nullable, nonatomic, copy) NSArray *dataSourceArr;
+
+/// 初始化地址选择器
+/// @param pickerMode 地址选择器显示类型
+- (instancetype)initWithPickerMode:(BRAddressPickerMode)pickerMode;
+
+/// 弹出选择器视图
+- (void)show;
+
+/// 关闭选择器视图
+- (void)dismiss;
+
+
+
+
+//================================================= 华丽的分割线 =================================================
+
+
+
+
+/**
+ //////////////////////////////////////////////////////////////////////////
+ ///
+ ///   【用法二】:快捷使用,直接选择下面其中的一个方法进行使用
+ ///    特点:快捷,方便
+ ///
+ ////////////////////////////////////////////////////////////////////////*/
+
+/**
+ *  1.显示地址选择器
+ *
+ *  @param selectIndexs             默认选中的值(传索引数组,如:@[@10, @0, @4])
+ *  @param resultBlock              选择后的回调
+ *
+ */
++ (void)showAddressPickerWithSelectIndexs:(nullable NSArray <NSNumber *> *)selectIndexs
+                              resultBlock:(nullable BRAddressResultBlock)resultBlock;
+
+/**
+ *  2.显示地址选择器
+ *
+ *  @param mode                     地址选择器显示类型
+ *  @param selectIndexs             默认选中的值(传索引数组,如:@[@10, @0, @4])
+ *  @param isAutoSelect             是否自动选择,即滚动选择器后就执行结果回调,默认为 NO
+ *  @param resultBlock              选择后的回调
+ *
+ */
++ (void)showAddressPickerWithMode:(BRAddressPickerMode)mode
+                     selectIndexs:(nullable NSArray <NSNumber *> *)selectIndexs
+                     isAutoSelect:(BOOL)isAutoSelect
+                      resultBlock:(nullable BRAddressResultBlock)resultBlock;
+
+/**
+ *  3.显示地址选择器
+ *
+ *  @param mode                     地址选择器显示类型
+ *  @param dataSource               地区数据源
+ *  @param selectIndexs             默认选中的值(传索引数组,如:@[@10, @0, @4])
+ *  @param isAutoSelect             是否自动选择,即滚动选择器后就执行结果回调,默认为 NO
+ *  @param resultBlock              选择后的回调
+ *
+ */
++ (void)showAddressPickerWithMode:(BRAddressPickerMode)mode
+                       dataSource:(nullable NSArray *)dataSource
+                     selectIndexs:(nullable NSArray <NSNumber *> *)selectIndexs
+                     isAutoSelect:(BOOL)isAutoSelect
+                      resultBlock:(nullable BRAddressResultBlock)resultBlock;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 600 - 0
Pods/BRPickerView/BRPickerView/AddressPickerView/BRAddressPickerView.m

@@ -0,0 +1,600 @@
+//
+//  BRAddressPickerView.m
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2017/8/11.
+//  Copyright © 2017 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import "BRAddressPickerView.h"
+#import "NSBundle+BRPickerView.h"
+
+@interface BRAddressPickerView ()<UIPickerViewDataSource, UIPickerViewDelegate>
+// 地址选择器
+@property (nonatomic, strong) UIPickerView *pickerView;
+// 省模型数组
+@property(nonatomic, copy) NSArray *provinceModelArr;
+// 市模型数组
+@property(nonatomic, copy) NSArray *cityModelArr;
+// 区模型数组
+@property(nonatomic, copy) NSArray *areaModelArr;
+// 选中的省
+@property(nonatomic, strong) BRProvinceModel *selectProvinceModel;
+// 选中的市
+@property(nonatomic, strong) BRCityModel *selectCityModel;
+// 选中的区
+@property(nonatomic, strong) BRAreaModel *selectAreaModel;
+// 记录省选中的位置
+@property(nonatomic, assign) NSInteger provinceIndex;
+// 记录市选中的位置
+@property(nonatomic, assign) NSInteger cityIndex;
+// 记录区选中的位置
+@property(nonatomic, assign) NSInteger areaIndex;
+
+@property (nonatomic, copy) NSArray <NSString *>* mSelectValues;
+
+@end
+
+@implementation BRAddressPickerView
+
+#pragma mark - 1.显示地址选择器
++ (void)showAddressPickerWithSelectIndexs:(NSArray <NSNumber *>*)selectIndexs
+                              resultBlock:(BRAddressResultBlock)resultBlock {
+    [self showAddressPickerWithMode:BRAddressPickerModeArea dataSource:nil selectIndexs:selectIndexs isAutoSelect:NO resultBlock:resultBlock];
+}
+
+#pragma mark - 2.显示地址选择器
++ (void)showAddressPickerWithMode:(BRAddressPickerMode)mode
+                     selectIndexs:(NSArray <NSNumber *>*)selectIndexs
+                     isAutoSelect:(BOOL)isAutoSelect
+                      resultBlock:(BRAddressResultBlock)resultBlock {
+    [self showAddressPickerWithMode:mode dataSource:nil selectIndexs:selectIndexs isAutoSelect:isAutoSelect resultBlock:resultBlock];
+}
+
+
+#pragma mark - 3.显示地址选择器
++ (void)showAddressPickerWithMode:(BRAddressPickerMode)mode
+                       dataSource:(NSArray *)dataSource
+                     selectIndexs:(NSArray <NSNumber *>*)selectIndexs
+                     isAutoSelect:(BOOL)isAutoSelect
+                      resultBlock:(BRAddressResultBlock)resultBlock {
+    // 创建地址选择器
+    BRAddressPickerView *addressPickerView = [[BRAddressPickerView alloc] initWithPickerMode:mode];
+    addressPickerView.dataSourceArr = dataSource;
+    addressPickerView.selectIndexs = selectIndexs;
+    addressPickerView.isAutoSelect = isAutoSelect;
+    addressPickerView.resultBlock = resultBlock;
+    // 显示
+    [addressPickerView show];
+}
+
+#pragma mark - 初始化地址选择器
+- (instancetype)initWithPickerMode:(BRAddressPickerMode)pickerMode {
+    if (self = [super init]) {
+        self.pickerMode = pickerMode;
+    }
+    return self;
+}
+
+#pragma mark - 处理选择器数据
+- (void)handlerPickerData {
+    if (self.dataSourceArr && self.dataSourceArr.count > 0) {
+        id item = [self.dataSourceArr firstObject];
+        // 如果传的值是解析好的模型数组
+        if ([item isKindOfClass:[BRProvinceModel class]]) {
+            self.provinceModelArr = self.dataSourceArr;
+        } else {
+            self.provinceModelArr = [self getProvinceModelArr:self.dataSourceArr];
+        }
+    } else {
+        // 如果外部没有传入地区数据源,就使用本地的数据源
+        NSArray *dataSource = [NSBundle br_addressJsonArray];
+        
+        if (!dataSource || dataSource.count == 0) {
+            return;
+        }
+        self.dataSourceArr = dataSource;
+        self.provinceModelArr = [self getProvinceModelArr:self.dataSourceArr];
+    }
+    
+    // 设置默认值
+    [self handlerDefaultSelectValue];
+}
+
+#pragma mark - 获取模型数组
+- (NSArray <BRProvinceModel *>*)getProvinceModelArr:(NSArray *)dataSourceArr {
+    NSMutableArray *tempArr1 = [NSMutableArray array];
+    for (NSDictionary *proviceDic in dataSourceArr) {
+        BRProvinceModel *proviceModel = [[BRProvinceModel alloc]init];
+        proviceModel.code = [proviceDic objectForKey:@"code"];
+        proviceModel.name = [proviceDic objectForKey:@"name"];
+        proviceModel.index = [dataSourceArr indexOfObject:proviceDic];
+        NSArray *cityList = [proviceDic.allKeys containsObject:@"cityList"] ? [proviceDic objectForKey:@"cityList"] : [proviceDic objectForKey:@"citylist"];
+        NSMutableArray *tempArr2 = [NSMutableArray array];
+        for (NSDictionary *cityDic in cityList) {
+            BRCityModel *cityModel = [[BRCityModel alloc]init];
+            cityModel.code = [cityDic objectForKey:@"code"];
+            cityModel.name = [cityDic objectForKey:@"name"];
+            cityModel.index = [cityList indexOfObject:cityDic];
+            NSArray *areaList = [cityDic.allKeys containsObject:@"areaList"] ? [cityDic objectForKey:@"areaList"] : [cityDic objectForKey:@"arealist"];
+            NSMutableArray *tempArr3 = [NSMutableArray array];
+            for (NSDictionary *areaDic in areaList) {
+                BRAreaModel *areaModel = [[BRAreaModel alloc]init];
+                areaModel.code = [areaDic objectForKey:@"code"];
+                areaModel.name = [areaDic objectForKey:@"name"];
+                areaModel.index = [areaList indexOfObject:areaDic];
+                [tempArr3 addObject:areaModel];
+            }
+            cityModel.arealist = [tempArr3 copy];
+            [tempArr2 addObject:cityModel];
+        }
+        proviceModel.citylist = [tempArr2 copy];
+        [tempArr1 addObject:proviceModel];
+    }
+    return [tempArr1 copy];
+}
+
+#pragma mark - 设置默认选择的值
+- (void)handlerDefaultSelectValue {
+    __block NSString *selectProvinceName = nil;
+    __block NSString *selectCityName = nil;
+    __block NSString *selectAreaName = nil;
+    
+    if (self.mSelectValues.count > 0) {
+        selectProvinceName = self.mSelectValues.count > 0 ? self.mSelectValues[0] : nil;
+        selectCityName = self.mSelectValues.count > 1 ? self.mSelectValues[1] : nil;
+        selectAreaName = self.mSelectValues.count > 2 ? self.mSelectValues[2] : nil;
+    }
+    
+    if (self.pickerMode == BRAddressPickerModeProvince || self.pickerMode == BRAddressPickerModeCity || self.pickerMode == BRAddressPickerModeArea) {
+        if (self.selectIndexs.count > 0) {
+            NSInteger provinceIndex = [self.selectIndexs[0] integerValue];
+            self.provinceIndex = (provinceIndex > 0 && provinceIndex < self.provinceModelArr.count) ? provinceIndex : 0;
+            self.selectProvinceModel = self.provinceModelArr.count > self.provinceIndex ? self.provinceModelArr[self.provinceIndex] : nil;
+        } else {
+            self.provinceIndex = 0;
+            self.selectProvinceModel = self.provinceModelArr.count > 0 ? self.provinceModelArr[0] : nil;
+            @weakify(self)
+            [self.provinceModelArr enumerateObjectsUsingBlock:^(BRProvinceModel *  _Nonnull model, NSUInteger idx, BOOL * _Nonnull stop) {
+                @strongify(self)
+                if (selectProvinceName && [model.name isEqualToString:selectProvinceName]) {
+                    self.provinceIndex = idx;
+                    self.selectProvinceModel = model;
+                    *stop = YES;
+                }
+            }];
+        }
+    }
+    
+    if (self.pickerMode == BRAddressPickerModeCity || self.pickerMode == BRAddressPickerModeArea) {
+        self.cityModelArr = [self getCityModelArray:self.provinceIndex];
+        if (self.selectIndexs.count > 0) {
+            NSInteger cityIndex = self.selectIndexs.count > 1 ? [self.selectIndexs[1] integerValue] : 0;
+            self.cityIndex = (cityIndex > 0 && cityIndex < self.cityModelArr.count) ? cityIndex : 0;
+            self.selectCityModel = self.cityModelArr.count > self.cityIndex ? self.cityModelArr[self.cityIndex] : nil;
+        } else {
+            self.cityIndex = 0;
+            self.selectCityModel = self.cityModelArr.count > 0 ? self.cityModelArr[0] : nil;
+            @weakify(self)
+            [self.cityModelArr enumerateObjectsUsingBlock:^(BRCityModel *  _Nonnull model, NSUInteger idx, BOOL * _Nonnull stop) {
+                @strongify(self)
+                if (selectCityName && [model.name isEqualToString:selectCityName]) {
+                    self.cityIndex = idx;
+                    self.selectCityModel = model;
+                    *stop = YES;
+                }
+            }];
+        }
+    }
+    
+    if (self.pickerMode == BRAddressPickerModeArea) {
+        self.areaModelArr = [self getAreaModelArray:self.provinceIndex cityIndex:self.cityIndex];
+        if (self.selectIndexs.count > 0) {
+            NSInteger areaIndex = self.selectIndexs.count > 2 ? [self.selectIndexs[2] integerValue] : 0;
+            self.areaIndex = (areaIndex > 0 && areaIndex < self.areaModelArr.count) ? areaIndex : 0;
+            self.selectAreaModel = self.areaModelArr.count > self.areaIndex ? self.areaModelArr[self.areaIndex] : nil;
+        } else {
+            self.areaIndex = 0;
+            self.selectAreaModel = self.areaModelArr.count > 0 ? self.areaModelArr[0] : nil;
+            @weakify(self)
+            [self.areaModelArr enumerateObjectsUsingBlock:^(BRAreaModel *  _Nonnull model, NSUInteger idx, BOOL * _Nonnull stop) {
+                @strongify(self)
+                if (selectAreaName && [model.name isEqualToString:selectAreaName]) {
+                    self.areaIndex = idx;
+                    self.selectAreaModel = model;
+                    *stop = YES;
+                }
+            }];
+        }
+    }
+}
+
+// 根据 省索引 获取 城市模型数组
+- (NSArray *)getCityModelArray:(NSInteger)provinceIndex {
+    BRProvinceModel *provinceModel = self.provinceModelArr[provinceIndex];
+    // 返回城市模型数组
+    return provinceModel.citylist;
+}
+
+// 根据 省索引和城市索引 获取 区域模型数组
+- (NSArray *)getAreaModelArray:(NSInteger)provinceIndex cityIndex:(NSInteger)cityIndex {
+    BRProvinceModel *provinceModel = self.provinceModelArr[provinceIndex];
+    if (provinceModel.citylist && provinceModel.citylist.count > 0) {
+        BRCityModel *cityModel = provinceModel.citylist[cityIndex];
+        // 返回地区模型数组
+        return cityModel.arealist;
+    } else {
+        return nil;
+    }
+}
+
+#pragma mark - 地址选择器
+- (UIPickerView *)pickerView {
+    if (!_pickerView) {
+        CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
+        _pickerView = [[UIPickerView alloc]initWithFrame:CGRectMake(0, self.pickerStyle.titleBarHeight + pickerHeaderViewHeight, self.keyView.bounds.size.width, self.pickerStyle.pickerHeight)];
+        _pickerView.backgroundColor = self.pickerStyle.pickerColor;
+        _pickerView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
+        _pickerView.dataSource = self;
+        _pickerView.delegate = self;
+    }
+    return _pickerView;
+}
+
+#pragma mark - UIPickerViewDataSource
+// 1.设置 pickerView 的列数
+- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
+    switch (self.pickerMode) {
+        case BRAddressPickerModeProvince:
+            return 1;
+            break;
+        case BRAddressPickerModeCity:
+            return 2;
+            break;
+        case BRAddressPickerModeArea:
+            return 3;
+            break;
+            
+        default:
+            break;
+    }
+}
+
+// 2.设置 pickerView 每列的行数
+- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
+    if (component == 0) {
+        // 返回省个数
+        return self.provinceModelArr.count;
+    }
+    if (component == 1) {
+        // 返回市个数
+        return self.cityModelArr.count;
+    }
+    if (component == 2) {
+        // 返回区个数
+        return self.areaModelArr.count;
+    }
+    return 0;
+}
+
+#pragma mark - UIPickerViewDelegate
+// 3.设置 pickerView 的显示内容
+- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view {
+    // 1.自定义 row 的内容视图
+    UILabel *label = (UILabel *)view;
+    if (!label) {
+        label = [[UILabel alloc]init];
+        label.backgroundColor = [UIColor clearColor];
+        label.textAlignment = NSTextAlignmentCenter;
+        label.font = self.pickerStyle.pickerTextFont;
+        label.textColor = self.pickerStyle.pickerTextColor;
+        // 字体自适应属性
+        label.adjustsFontSizeToFitWidth = YES;
+        // 自适应最小字体缩放比例
+        label.minimumScaleFactor = 0.5f;
+    }
+    if (component == 0) {
+        BRProvinceModel *model = self.provinceModelArr[row];
+        label.text = model.name;
+    } else if (component == 1) {
+        BRCityModel *model = self.cityModelArr[row];
+        label.text = model.name;
+    } else if (component == 2) {
+        BRAreaModel *model = self.areaModelArr[row];
+        label.text = model.name;
+    }
+    
+    // 2.设置选择器中间选中行的样式
+    [self setPickerSelectRowStyle:pickerView titleForRow:row forComponent:component];
+    
+    return label;
+}
+
+#pragma mark - 设置选择器中间选中行的样式
+- (void)setPickerSelectRowStyle:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
+    // 1.设置分割线的颜色
+    for (UIView *subView in pickerView.subviews) {
+        if (subView && [subView isKindOfClass:[UIView class]] && subView.frame.size.height <= 1) {
+            subView.backgroundColor = self.pickerStyle.separatorColor;
+        }
+    }
+    
+    // 2.设置选择器中间选中行的背景颜色
+    if (self.pickerStyle.selectRowColor) {
+        UIView *contentView = nil;
+        NSArray *subviews = pickerView.subviews;
+        if (subviews.count > 0) {
+            id obj = subviews.firstObject;
+            if (obj && [obj isKindOfClass:[UIView class]]) {
+                contentView = (UIView *)obj;
+            }
+        }
+        UIView *columnView = nil;
+        if (contentView) {
+            id obj = [contentView valueForKey:@"subviewCache"];
+            if (obj && [obj isKindOfClass:[NSArray class]]) {
+                NSArray *columnViews = (NSArray *)obj;
+                if (columnViews.count > 0) {
+                    id columnObj = columnViews.firstObject;
+                    if (columnObj && [columnObj isKindOfClass:[UIView class]]) {
+                        columnView = (UIView *)columnObj;
+                    }
+                }
+            }
+        }
+        if (columnView) {
+            id obj = [columnView valueForKey:@"middleContainerView"];
+            if (obj && [obj isKindOfClass:[UIView class]]) {
+                UIView *selectRowView = (UIView *)obj;
+                selectRowView.backgroundColor = self.pickerStyle.selectRowColor;
+            }
+        }
+    }
+    
+    // 3.设置选择器中间选中行的字体颜色/字体大小
+    if (self.pickerStyle.selectRowTextColor || self.pickerStyle.selectRowTextFont) {
+        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+            // 当前选中的 label
+            UILabel *selectLabel = (UILabel *)[pickerView viewForRow:row forComponent:component];
+            if (selectLabel) {
+                if (self.pickerStyle.selectRowTextColor) {
+                    selectLabel.textColor = self.pickerStyle.selectRowTextColor;
+                }
+                if (self.pickerStyle.selectRowTextFont) {
+                    selectLabel.font = self.pickerStyle.selectRowTextFont;
+                }
+            }
+        });
+    }
+}
+
+// 4.滚动 pickerView 执行的回调方法
+- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
+    if (component == 0) { // 选择省
+        // 保存选择的省份的索引
+        self.provinceIndex = row;
+        switch (self.pickerMode) {
+            case BRAddressPickerModeProvince:
+            {
+                self.selectProvinceModel = self.provinceModelArr.count > self.provinceIndex ? self.provinceModelArr[self.provinceIndex] : nil;
+                self.selectCityModel = nil;
+                self.selectAreaModel = nil;
+            }
+                break;
+            case BRAddressPickerModeCity:
+            {
+                self.cityModelArr = [self getCityModelArray:self.provinceIndex];
+                [self.pickerView reloadComponent:1];
+                [self.pickerView selectRow:0 inComponent:1 animated:YES];
+                self.selectProvinceModel = self.provinceModelArr.count > self.provinceIndex ? self.provinceModelArr[self.provinceIndex] : nil;
+                self.selectCityModel = self.cityModelArr.count > 0 ? self.cityModelArr[0] : nil;
+                self.selectAreaModel = nil;
+            }
+                break;
+            case BRAddressPickerModeArea:
+            {
+                self.cityModelArr = [self getCityModelArray:self.provinceIndex];
+                self.areaModelArr = [self getAreaModelArray:self.provinceIndex cityIndex:0];
+                [self.pickerView reloadComponent:1];
+                [self.pickerView selectRow:0 inComponent:1 animated:YES];
+                [self.pickerView reloadComponent:2];
+                [self.pickerView selectRow:0 inComponent:2 animated:YES];
+                self.selectProvinceModel = self.provinceModelArr.count > self.provinceIndex ? self.provinceModelArr[self.provinceIndex] : nil;
+                self.selectCityModel = self.cityModelArr.count > 0 ? self.cityModelArr[0] : nil;
+                self.selectAreaModel = self.areaModelArr.count > 0 ? self.areaModelArr[0] : nil;
+            }
+                break;
+            default:
+                break;
+        }
+    }
+    if (component == 1) { // 选择市
+        // 保存选择的城市的索引
+        self.cityIndex = row;
+        switch (self.pickerMode) {
+            case BRAddressPickerModeCity:
+            {
+                self.selectCityModel = self.cityModelArr.count > self.cityIndex ? self.cityModelArr[self.cityIndex] : nil;
+                self.selectAreaModel = nil;
+            }
+                break;
+            case BRAddressPickerModeArea:
+            {
+                self.areaModelArr = [self getAreaModelArray:self.provinceIndex cityIndex:self.cityIndex];
+                [self.pickerView reloadComponent:2];
+                [self.pickerView selectRow:0 inComponent:2 animated:YES];
+                self.selectCityModel = self.cityModelArr.count > self.cityIndex ? self.cityModelArr[self.cityIndex] : nil;
+                self.selectAreaModel = self.areaModelArr.count > 0 ? self.areaModelArr[0] : nil;
+            }
+                break;
+            default:
+                break;
+        }
+    }
+    if (component == 2) { // 选择区
+        // 保存选择的地区的索引
+        self.areaIndex = row;
+        if (self.pickerMode == BRAddressPickerModeArea) {
+            self.selectAreaModel = self.areaModelArr.count > self.areaIndex ? self.areaModelArr[self.areaIndex] : nil;
+        }
+    }
+    
+    // 滚动选择时执行 changeBlock
+    if (self.changeBlock) {
+        self.changeBlock(self.selectProvinceModel, self.selectCityModel, self.selectAreaModel);
+    }
+    
+    // 设置自动选择时,滚动选择时就执行 resultBlock
+    if (self.isAutoSelect) {
+        if (self.resultBlock) {
+            self.resultBlock(self.selectProvinceModel, self.selectCityModel, self.selectAreaModel);
+        }
+    }
+}
+
+// 设置行高
+- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component {
+    return self.pickerStyle.rowHeight;
+}
+
+#pragma mark - 重写父类方法
+- (void)reloadData {
+    // 1.处理数据源
+    [self handlerPickerData];
+    // 2.刷新选择器
+    [self.pickerView reloadAllComponents];
+    // 3.滚动到选择的地区
+    if (self.pickerMode == BRAddressPickerModeProvince) {
+        [self.pickerView selectRow:self.provinceIndex inComponent:0 animated:YES];
+    } else if (self.pickerMode == BRAddressPickerModeCity) {
+        [self.pickerView selectRow:self.provinceIndex inComponent:0 animated:YES];
+        [self.pickerView selectRow:self.cityIndex inComponent:1 animated:YES];
+    } else if (self.pickerMode == BRAddressPickerModeArea) {
+        [self.pickerView selectRow:self.provinceIndex inComponent:0 animated:YES];
+        [self.pickerView selectRow:self.cityIndex inComponent:1 animated:YES];
+        [self.pickerView selectRow:self.areaIndex inComponent:2 animated:YES];
+    }
+}
+
+- (void)addPickerToView:(UIView *)view {
+    // 1.添加地址选择器
+    if (view) {
+        // 立即刷新容器视图 view 的布局(防止 view 使用自动布局时,选择器视图无法正常显示)
+        [view setNeedsLayout];
+        [view layoutIfNeeded];
+        
+        self.frame = view.bounds;
+        CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
+        CGFloat pickerFooterViewHeight = self.pickerFooterView ? self.pickerFooterView.bounds.size.height : 0;
+        self.pickerView.frame = CGRectMake(0, pickerHeaderViewHeight, view.bounds.size.width, view.bounds.size.height - pickerHeaderViewHeight - pickerFooterViewHeight);
+        [self addSubview:self.pickerView];
+    } else {
+        [self.alertView addSubview:self.pickerView];
+    }
+    
+    // 2.绑定数据
+    [self reloadData];
+    
+    __weak typeof(self) weakSelf = self;
+    self.doneBlock = ^{
+        // 点击确定按钮后,执行block回调
+        [weakSelf removePickerFromView:view];
+        
+        if (weakSelf.resultBlock) {
+            weakSelf.resultBlock(weakSelf.selectProvinceModel, weakSelf.selectCityModel, weakSelf.selectAreaModel);
+        }
+    };
+    
+    [super addPickerToView:view];
+}
+
+#pragma mark - 重写父类方法
+- (void)addSubViewToPicker:(UIView *)customView {
+    [self.pickerView addSubview:customView];
+}
+
+#pragma mark - 弹出选择器视图
+- (void)show {
+    [self addPickerToView:nil];
+}
+
+#pragma mark - 关闭选择器视图
+- (void)dismiss {
+    [self removePickerFromView:nil];
+}
+
+#pragma mark - setter方法
+- (void)setSelectValues:(NSArray<NSString *> *)selectValues {
+    self.mSelectValues = selectValues;
+}
+
+#pragma mark - getter方法
+- (NSArray *)provinceModelArr {
+    if (!_provinceModelArr) {
+        _provinceModelArr = [NSArray array];
+    }
+    return _provinceModelArr;
+}
+
+- (NSArray *)cityModelArr {
+    if (!_cityModelArr) {
+        _cityModelArr = [NSArray array];
+    }
+    return _cityModelArr;
+}
+
+- (NSArray *)areaModelArr {
+    if (!_areaModelArr) {
+        _areaModelArr = [NSArray array];
+    }
+    return _areaModelArr;
+}
+
+- (BRProvinceModel *)selectProvinceModel {
+    if (!_selectProvinceModel) {
+        _selectProvinceModel = [[BRProvinceModel alloc]init];
+    }
+    return _selectProvinceModel;
+}
+
+- (BRCityModel *)selectCityModel {
+    if (!_selectCityModel) {
+        _selectCityModel = [[BRCityModel alloc]init];
+        _selectCityModel.code = @"";
+        _selectCityModel.name = @"";
+    }
+    return _selectCityModel;
+}
+
+- (BRAreaModel *)selectAreaModel {
+    if (!_selectAreaModel) {
+        _selectAreaModel = [[BRAreaModel alloc]init];
+        _selectAreaModel.code = @"";
+        _selectAreaModel.name = @"";
+    }
+    return _selectAreaModel;
+}
+
+- (NSArray *)dataSourceArr {
+    if (!_dataSourceArr) {
+        _dataSourceArr = [NSArray array];
+    }
+    return _dataSourceArr;
+}
+
+- (NSArray<NSString *> *)mSelectValues {
+    if (!_mSelectValues) {
+        _mSelectValues = [NSArray array];
+    }
+    return _mSelectValues;
+}
+
+- (NSArray<NSNumber *> *)selectIndexs {
+    if (!_selectIndexs) {
+        _selectIndexs = [NSArray array];
+    }
+    return _selectIndexs;
+}
+
+@end

+ 17 - 0
Pods/BRPickerView/BRPickerView/BRPickerView.h

@@ -0,0 +1,17 @@
+//
+//  BRPickerView.h
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2017/8/11.
+//  Copyright © 2017 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#ifndef BRPickerView_h
+#define BRPickerView_h
+
+#import "BRDatePickerView.h"
+#import "BRAddressPickerView.h"
+#import "BRStringPickerView.h"
+
+#endif /* BRPickerView_h */

+ 74 - 0
Pods/BRPickerView/BRPickerView/Base/BRBaseView.h

@@ -0,0 +1,74 @@
+//
+//  BaseView.h
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2017/8/11.
+//  Copyright © 2017 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import <UIKit/UIKit.h>
+#import "BRPickerStyle.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^BRCancelBlock)(void);
+typedef void(^BRResultBlock)(void);
+
+@interface BRBaseView : UIView
+
+/** 选择器标题 */
+@property (nullable, nonatomic, copy) NSString *title;
+
+/** 是否自动选择,即滚动选择器后就执行结果回调,默认为 NO */
+@property (nonatomic, assign) BOOL isAutoSelect;
+
+/** 自定义UI样式(不传或为nil时,是默认样式) */
+@property (nullable, nonatomic, strong) BRPickerStyle *pickerStyle;
+
+/** 取消选择的回调 */
+@property (nullable, nonatomic, copy) BRCancelBlock cancelBlock;
+
+/** accessory view for above picker view. default is nil */
+@property (nullable, nonatomic, strong) UIView *pickerHeaderView;
+
+/** accessory view below picker view. default is nil */
+@property (nullable, nonatomic, strong) UIView *pickerFooterView;
+
+/** 选择结果的回调(框架内部使用) */
+@property (nullable, nonatomic, copy) BRResultBlock doneBlock;
+
+/** 弹框视图(使用场景:可以在 alertView 上添加选择器的自定义背景视图) */
+@property (nullable, nonatomic, strong) UIView *alertView;
+
+/** 组件的父视图:可以传 自己获取的 keyWindow,或页面的 view */
+@property (nullable, nonatomic, strong) UIView *keyView;
+
+
+/// 刷新选择器数据
+/// 应用场景:动态更新数据源、动态更新选择的值、选择器类型切换等
+- (void)reloadData;
+
+/// 扩展一:添加选择器到指定容器视图上
+/// 应用场景:可将中间的滚轮选择器 pickerView 视图(不包含蒙层及标题栏)添加到任何自定义视图上(会自动填满容器视图),也方便自定义更多的弹框样式
+/// @param view 容器视图
+- (void)addPickerToView:(nullable UIView *)view NS_REQUIRES_SUPER;
+
+/// 从指定容器视图上移除选择器
+/// @param view 容器视图
+- (void)removePickerFromView:(nullable UIView *)view;
+
+/// 扩展二:添加自定义视图到选择器(pickerView)上
+/// 应用场景:可以添加一些固定的标题、单位等到选择器中间
+/// @param customView 自定义视图
+- (void)addSubViewToPicker:(UIView *)customView;
+
+/// 扩展三:添加自定义视图到标题栏(titleBarView)上
+/// 应用场景:可以添加一些子控件到标题栏
+/// @param customView 自定义视图
+- (void)addSubViewToTitleBar:(UIView *)customView;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 394 - 0
Pods/BRPickerView/BRPickerView/Base/BRBaseView.m

@@ -0,0 +1,394 @@
+//
+//  BaseView.m
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2017/8/11.
+//  Copyright © 2017 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import "BRBaseView.h"
+
+@interface BRBaseView ()
+// 蒙层视图
+@property (nonatomic, strong) UIView *maskView;
+// 标题栏背景视图
+@property (nonatomic, strong) UIView *titleBarView;
+// 左边取消按钮
+@property (nonatomic, strong) UIButton *cancelBtn;
+// 右边确定按钮
+@property (nonatomic, strong) UIButton *doneBtn;
+// 中间标题
+@property (nonatomic, strong) UILabel *titleLabel;
+
+// 取消按钮离屏幕边缘的距离
+@property (nonatomic, assign) CGFloat cancelBtnMargin;
+// 确定按钮离屏幕边缘的距离
+@property (nonatomic, assign) CGFloat doneBtnMargin;
+
+@end
+
+@implementation BRBaseView
+
+- (void)initUI {
+    self.frame = self.keyView.bounds;
+    // 设置子视图的宽度随着父视图变化
+    self.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+    
+    if (!self.pickerStyle.hiddenMaskView) {
+        [self addSubview:self.maskView];
+    }
+    
+    [self addSubview:self.alertView];
+    
+    // 是否隐藏标题栏
+    if (!self.pickerStyle.hiddenTitleBarView) {
+        [self.alertView addSubview:self.titleBarView];
+        [self.alertView sendSubviewToBack:self.titleBarView];
+
+        if (!self.pickerStyle.hiddenTitleLabel) {
+            [self.titleBarView addSubview:self.titleLabel];
+        }
+        if (!self.pickerStyle.hiddenCancelBtn) {
+            [self.titleBarView addSubview:self.cancelBtn];
+            // 获取边距
+            if (self.pickerStyle.cancelBtnFrame.origin.x < self.bounds.size.width / 2) {
+                self.cancelBtnMargin = self.pickerStyle.cancelBtnFrame.origin.x;
+            } else {
+                self.cancelBtnMargin = self.bounds.size.width - self.pickerStyle.cancelBtnFrame.origin.x - self.pickerStyle.cancelBtnFrame.size.width;
+            }
+        }
+        if (!self.pickerStyle.hiddenDoneBtn) {
+            [self.titleBarView addSubview:self.doneBtn];
+            // 获取边距
+            if (self.pickerStyle.doneBtnFrame.origin.x < self.bounds.size.width / 2) {
+                self.doneBtnMargin = self.pickerStyle.doneBtnFrame.origin.x;
+            } else {
+                self.doneBtnMargin = self.bounds.size.width - self.pickerStyle.doneBtnFrame.origin.x - self.pickerStyle.doneBtnFrame.size.width;
+            }
+        }
+    }
+}
+
+#pragma mark - 适配横屏安全区域,更新子视图布局
+- (void)layoutSubviews {
+    [super layoutSubviews];
+    if (_cancelBtn || _doneBtn) {
+        if (@available(iOS 11.0, *)) {
+            UIEdgeInsets safeInsets = self.safeAreaInsets;
+            if (_cancelBtn) {
+                CGRect cancelBtnFrame = self.pickerStyle.cancelBtnFrame;
+                if (cancelBtnFrame.origin.x < MIN(self.bounds.size.width / 2, self.bounds.size.height / 2)) {
+                    cancelBtnFrame.origin.x += safeInsets.left;
+                } else {
+                    cancelBtnFrame.origin.x = self.bounds.size.width - cancelBtnFrame.size.width - safeInsets.right - self.cancelBtnMargin;
+                }
+                self.cancelBtn.frame = cancelBtnFrame;
+            }
+            if (_doneBtn) {
+                CGRect doneBtnFrame = self.pickerStyle.doneBtnFrame;
+                if (doneBtnFrame.origin.x < MIN(self.bounds.size.width / 2, self.bounds.size.height / 2)) {
+                    doneBtnFrame.origin.x += safeInsets.left;
+                } else {
+                    doneBtnFrame.origin.x = self.bounds.size.width - doneBtnFrame.size.width - safeInsets.right - self.doneBtnMargin;
+                }
+                self.doneBtn.frame = doneBtnFrame;
+            }
+        }
+    }
+    
+    if (_alertView && self.pickerStyle.topCornerRadius > 0) {
+        // 设置顶部圆角
+        [self br_setView:_alertView roundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight withRadius:self.pickerStyle.topCornerRadius];
+    }
+}
+
+#pragma mark - 蒙层视图
+- (UIView *)maskView {
+    if (!_maskView) {
+        _maskView = [[UIView alloc]initWithFrame:self.keyView.bounds];
+        _maskView.backgroundColor = self.pickerStyle.maskColor;
+        // 设置子视图的大小随着父视图变化
+        _maskView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+        _maskView.userInteractionEnabled = YES;
+        UITapGestureRecognizer *myTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(didTapMaskView:)];
+        [_maskView addGestureRecognizer:myTap];
+    }
+    return _maskView;
+}
+
+#pragma mark - 弹框视图
+- (UIView *)alertView {
+    if (!_alertView) {
+        CGFloat accessoryViewHeight = 0;
+        if (self.pickerHeaderView) {
+            accessoryViewHeight += self.pickerHeaderView.bounds.size.height;
+        }
+        if (self.pickerFooterView) {
+            accessoryViewHeight += self.pickerFooterView.bounds.size.height;
+        }
+        CGFloat height = self.pickerStyle.titleBarHeight + self.pickerStyle.pickerHeight + self.pickerStyle.paddingBottom + accessoryViewHeight;
+        _alertView = [[UIView alloc]initWithFrame:CGRectMake(0, self.keyView.bounds.size.height - height, self.keyView.bounds.size.width, height)];
+        _alertView.backgroundColor = self.pickerStyle.alertViewColor ? self.pickerStyle.alertViewColor : self.pickerStyle.pickerColor;
+        if (!self.pickerStyle.topCornerRadius && !self.pickerStyle.hiddenShadowLine) {
+            // 设置弹框视图顶部边框线
+            UIView *shadowLineView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, _alertView.frame.size.width, self.pickerStyle.shadowLineHeight)];
+            shadowLineView.backgroundColor = self.pickerStyle.shadowLineColor;
+            shadowLineView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
+            [_alertView addSubview:shadowLineView];
+        }
+        _alertView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
+    }
+    return _alertView;
+}
+
+#pragma mark - 标题栏视图
+- (UIView *)titleBarView {
+    if (!_titleBarView) {
+        _titleBarView =[[UIView alloc]initWithFrame:CGRectMake(0, 0, self.keyView.bounds.size.width, self.pickerStyle.titleBarHeight)];
+        _titleBarView.backgroundColor = self.pickerStyle.titleBarColor;
+        _titleBarView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
+        if (!self.pickerStyle.hiddenTitleLine) {
+            // 设置标题栏底部分割线
+            UIView *titleLineView = [[UIView alloc]initWithFrame:CGRectMake(0, _titleBarView.frame.size.height - 0.5f, _titleBarView.frame.size.width, 0.5f)];
+            titleLineView.backgroundColor = self.pickerStyle.titleLineColor;
+            titleLineView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
+            [_titleBarView addSubview:titleLineView];
+        }
+    }
+    return _titleBarView;
+}
+
+#pragma mark - 取消按钮
+- (UIButton *)cancelBtn {
+    if (!_cancelBtn) {
+        _cancelBtn = [UIButton buttonWithType:UIButtonTypeCustom];
+        _cancelBtn.frame = self.pickerStyle.cancelBtnFrame;
+        _cancelBtn.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin;
+        _cancelBtn.backgroundColor = self.pickerStyle.cancelColor;;
+        _cancelBtn.titleLabel.font = self.pickerStyle.cancelTextFont;
+        [_cancelBtn setTitleColor:self.pickerStyle.cancelTextColor forState:UIControlStateNormal];
+        if (self.pickerStyle.cancelBtnImage) {
+            [_cancelBtn setImage:self.pickerStyle.cancelBtnImage forState:UIControlStateNormal];
+        }
+        if (self.pickerStyle.cancelBtnTitle) {
+            [_cancelBtn setTitle:self.pickerStyle.cancelBtnTitle forState:UIControlStateNormal];
+        }
+        [_cancelBtn addTarget:self action:@selector(clickCancelBtn) forControlEvents:UIControlEventTouchUpInside];
+        // 设置按钮圆角或边框
+        if (self.pickerStyle.cancelBorderStyle == BRBorderStyleSolid) {
+            _cancelBtn.layer.cornerRadius = self.pickerStyle.cancelCornerRadius > 0 ? self.pickerStyle.cancelCornerRadius : 6.0f;
+            _cancelBtn.layer.borderColor = self.pickerStyle.cancelTextColor.CGColor;
+            _cancelBtn.layer.borderWidth = self.pickerStyle.cancelBorderWidth > 0 ? self.pickerStyle.cancelBorderWidth : 1.0f;
+            _cancelBtn.layer.masksToBounds = YES;
+        } else if (self.pickerStyle.cancelBorderStyle == BRBorderStyleFill) {
+            _cancelBtn.layer.cornerRadius = self.pickerStyle.cancelCornerRadius > 0 ? self.pickerStyle.cancelCornerRadius : 6.0f;
+            _cancelBtn.layer.masksToBounds = YES;
+        }
+    }
+    return _cancelBtn;
+}
+
+#pragma mark - 确定按钮
+- (UIButton *)doneBtn {
+    if (!_doneBtn) {
+        _doneBtn = [UIButton buttonWithType:UIButtonTypeCustom];
+        _doneBtn.frame = self.pickerStyle.doneBtnFrame;
+        _doneBtn.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin;
+        _doneBtn.backgroundColor = self.pickerStyle.doneColor;
+        if (self.pickerStyle.doneBtnImage) {
+            [_doneBtn setImage:self.pickerStyle.doneBtnImage forState:UIControlStateNormal];
+        }
+        if (self.pickerStyle.doneBtnTitle) {
+            _doneBtn.titleLabel.font = self.pickerStyle.doneTextFont;
+            [_doneBtn setTitleColor:self.pickerStyle.doneTextColor forState:UIControlStateNormal];
+            [_doneBtn setTitle:self.pickerStyle.doneBtnTitle forState:UIControlStateNormal];
+        }
+        [_doneBtn addTarget:self action:@selector(clickDoneBtn) forControlEvents:UIControlEventTouchUpInside];
+        // 设置按钮圆角或边框
+        if (self.pickerStyle.doneBorderStyle == BRBorderStyleSolid) {
+            _doneBtn.layer.cornerRadius = self.pickerStyle.doneCornerRadius > 0 ? self.pickerStyle.doneCornerRadius : 6.0f;
+            _doneBtn.layer.borderColor = self.pickerStyle.doneTextColor.CGColor;
+            _doneBtn.layer.borderWidth = self.pickerStyle.doneBorderWidth > 0 ? self.pickerStyle.doneBorderWidth : 1.0f;
+            _doneBtn.layer.masksToBounds = YES;
+        } else if (self.pickerStyle.doneBorderStyle == BRBorderStyleFill) {
+            _doneBtn.layer.cornerRadius = self.pickerStyle.doneCornerRadius > 0 ? self.pickerStyle.doneCornerRadius : 6.0f;
+            _doneBtn.layer.masksToBounds = YES;
+        }
+    }
+    return _doneBtn;
+}
+
+#pragma mark - 中间标题label
+- (UILabel *)titleLabel {
+    if (!_titleLabel) {
+        _titleLabel = [[UILabel alloc]initWithFrame:self.pickerStyle.titleLabelFrame];
+        _titleLabel.backgroundColor = self.pickerStyle.titleLabelColor;
+        _titleLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin;
+        _titleLabel.textAlignment = NSTextAlignmentCenter;
+        _titleLabel.font = self.pickerStyle.titleTextFont;
+        _titleLabel.textColor = self.pickerStyle.titleTextColor;
+        _titleLabel.text = self.title;
+    }
+    return _titleLabel;
+}
+
+#pragma mark - 点击蒙层视图事件
+- (void)didTapMaskView:(UITapGestureRecognizer *)sender {
+    [self removePickerFromView:nil];
+    if (self.cancelBlock) {
+        self.cancelBlock();
+    }
+}
+
+#pragma mark - 取消按钮的点击事件
+- (void)clickCancelBtn {
+    [self removePickerFromView:nil];
+    if (self.cancelBlock) {
+        self.cancelBlock();
+    }
+}
+
+#pragma mark - 确定按钮的点击事件
+- (void)clickDoneBtn {
+    if (self.doneBlock) {
+        self.doneBlock();
+    }
+}
+
+#pragma mark - 添加视图方法
+- (void)addPickerToView:(UIView *)view {
+    if (view) {
+        self.frame = view.bounds;
+        self.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+        
+        CGFloat accessoryViewHeight = 0;
+        if (self.pickerHeaderView) {
+            CGRect rect = self.pickerHeaderView.frame;
+            self.pickerHeaderView.frame = CGRectMake(0, 0, view.bounds.size.width, rect.size.height);
+            self.pickerHeaderView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
+            [self addSubview:self.pickerHeaderView];
+            
+            accessoryViewHeight += self.pickerHeaderView.bounds.size.height;
+        }
+        if (self.pickerFooterView) {
+            CGRect rect = self.pickerFooterView.frame;
+            self.pickerFooterView.frame = CGRectMake(0, view.bounds.size.height - rect.size.height, view.bounds.size.width, rect.size.height);
+            self.pickerFooterView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
+            [self addSubview:self.pickerFooterView];
+            
+            accessoryViewHeight += self.pickerFooterView.bounds.size.height;
+        }
+        
+        [view addSubview:self];
+    } else {
+        [self initUI];
+        
+        if (self.pickerHeaderView) {
+            CGRect rect = self.pickerHeaderView.frame;
+            CGFloat titleBarHeight = self.pickerStyle.hiddenTitleBarView ? 0 : self.pickerStyle.titleBarHeight;
+            self.pickerHeaderView.frame = CGRectMake(0, titleBarHeight, self.alertView.bounds.size.width, rect.size.height);
+            self.pickerHeaderView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
+            [self.alertView addSubview:self.pickerHeaderView];
+        }
+        if (self.pickerFooterView) {
+            CGRect rect = self.pickerFooterView.frame;
+            self.pickerFooterView.frame = CGRectMake(0, self.alertView.bounds.size.height - self.pickerStyle.paddingBottom - rect.size.height, self.alertView.bounds.size.width, rect.size.height);
+            self.pickerFooterView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
+            [self.alertView addSubview:self.pickerFooterView];
+        }
+    
+        [self.keyView addSubview:self];
+        // 动画前初始位置
+        CGRect rect = self.alertView.frame;
+        rect.origin.y = self.bounds.size.height;
+        self.alertView.frame = rect;
+        // 弹出动画
+        if (!self.pickerStyle.hiddenMaskView) {
+            self.maskView.alpha = 0;
+        }
+        [UIView animateWithDuration:0.3 animations:^{
+            if (!self.pickerStyle.hiddenMaskView) {
+                self.maskView.alpha = 1;
+            }
+            CGFloat alertViewHeight = self.alertView.bounds.size.height;
+            CGRect rect = self.alertView.frame;
+            rect.origin.y -= alertViewHeight;
+            self.alertView.frame = rect;
+        }];
+    }
+}
+
+#pragma mark - 移除视图方法
+- (void)removePickerFromView:(UIView *)view {
+    if (view) {
+        [self removeFromSuperview];
+    } else {
+        // 关闭动画
+        [UIView animateWithDuration:0.2 animations:^{
+            CGFloat alertViewHeight = self.alertView.bounds.size.height;
+            CGRect rect = self.alertView.frame;
+            rect.origin.y += alertViewHeight;
+            self.alertView.frame = rect;
+            if (!self.pickerStyle.hiddenMaskView) {
+                self.maskView.alpha = 0;
+            }
+        } completion:^(BOOL finished) {
+            [self removeFromSuperview];
+        }];
+    }
+}
+
+#pragma mark - 刷新选择器数据
+- (void)reloadData {
+    
+}
+
+#pragma mark - 添加自定义视图到选择器(picker)上
+- (void)addSubViewToPicker:(UIView *)customView {
+    
+}
+
+#pragma mark - 添加自定义视图到标题栏(titleBar)上
+- (void)addSubViewToTitleBar:(UIView *)customView {
+    if (!self.pickerStyle.hiddenTitleBarView) {
+        [self.titleBarView addSubview:customView];
+    }
+}
+
+- (BRPickerStyle *)pickerStyle {
+    if (!_pickerStyle) {
+        _pickerStyle = [[BRPickerStyle alloc]init];
+    }
+    return _pickerStyle;
+}
+
+- (UIView *)keyView {
+    if (!_keyView) {
+        _keyView = BRGetKeyWindow();
+    }
+    return _keyView;
+}
+
+#pragma mark - 设置 view 的部分圆角
+// corners(枚举类型,可组合使用):UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight | UIRectCornerAllCorners
+- (void)br_setView:(UIView *)view roundingCorners:(UIRectCorner)corners withRadius:(CGFloat)radius {
+    UIBezierPath *rounded = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(radius, radius)];
+    CAShapeLayer *shape = [[CAShapeLayer alloc]init];
+    [shape setPath:rounded.CGPath];
+    view.layer.mask = shape;
+}
+
+#pragma mark - setter 方法(支持动态设置标题)
+- (void)setTitle:(NSString *)title {
+    _title = title;
+    if (_titleLabel) {
+        _titleLabel.text = title;
+    }
+}
+
+- (void)dealloc {
+    NSLog(@"%@ dealloc", NSStringFromClass([self class]));
+}
+
+@end

+ 230 - 0
Pods/BRPickerView/BRPickerView/Base/BRPickerStyle.h

@@ -0,0 +1,230 @@
+//
+//  BRPickerStyle.h
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2019/10/2.
+//  Copyright © 2019 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+#import "BRPickerViewMacro.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+// 边框样式(左边取消按钮/右边确定按钮)
+typedef NS_ENUM(NSInteger, BRBorderStyle) {
+    /** 无边框(默认) */
+    BRBorderStyleNone = 0,
+    /** 有圆角和边框 */
+    BRBorderStyleSolid,
+    /** 仅有圆角 */
+    BRBorderStyleFill
+};
+
+@interface BRPickerStyle : NSObject
+
+
+/////////////////////////////// 蒙层视图(maskView)///////////////////////////////
+
+/** 设置背景颜色 */
+@property (nullable, nonatomic, strong) UIColor *maskColor;
+
+/** 隐藏 maskView,默认为 NO */
+@property (nonatomic, assign) BOOL hiddenMaskView;
+
+
+////////////////////////////// 弹框视图(alertView)///////////////////////////////
+
+/** 设置 alertView 弹框视图的背景颜色 */
+@property (nullable, nonatomic, strong) UIColor *alertViewColor;
+
+/** 设置 alertView 弹框视图左上和右上的圆角半径  */
+@property (nonatomic, assign) NSInteger topCornerRadius;
+
+/** 设置 alertView 弹框视图顶部边框线颜色  */
+@property (nullable, nonatomic, strong) UIColor *shadowLineColor;
+
+/** 设置 alertView 弹框视图顶部边框线高度  */
+@property (nonatomic, assign) CGFloat shadowLineHeight;
+
+/** 隐藏 alertView 弹框视图顶部边框线,默认为 NO */
+@property (nonatomic, assign) BOOL hiddenShadowLine;
+
+/** 设置 alertView 弹框视图底部内边距,默认为安全区域底部距屏幕底部的高度  */
+@property (nonatomic, assign) CGFloat paddingBottom;
+
+
+//////////////////////////// 标题栏视图(titleBarView) ////////////////////////////
+
+/** 设置 titleBarView 标题栏的背景颜色 */
+@property (nullable, nonatomic, strong) UIColor *titleBarColor;
+
+/** 设置 titleBarView 标题栏的高度 */
+@property (nonatomic, assign) CGFloat titleBarHeight;
+
+/** 设置 titleBarView 标题栏底部分割线颜色 */
+@property (nullable, nonatomic, strong) UIColor *titleLineColor;
+
+/** 隐藏 titleBarView 标题栏底部分割线,默认为 NO  */
+@property (nonatomic, assign) BOOL hiddenTitleLine;
+
+/** 隐藏 titleBarView,默认为 NO */
+@property (nonatomic, assign) BOOL hiddenTitleBarView;
+
+
+////////////////////////// 标题栏中间label(titleLabel)///////////////////////////
+
+/** 设置 titleLabel 的背景颜色 */
+@property (nullable, nonatomic, strong) UIColor *titleLabelColor;
+
+/** 设置 titleLabel 文本颜色 */
+@property (nullable, nonatomic, strong) UIColor *titleTextColor;
+
+/** 设置 titleLabel 字体大小 */
+@property (nullable, nonatomic, strong) UIFont *titleTextFont;
+
+/** 设置 titleLabel 的 frame */
+@property (nonatomic, assign) CGRect titleLabelFrame;
+
+/** 隐藏 titleLabel,默认为 NO */
+@property (nonatomic, assign) BOOL hiddenTitleLabel;
+
+
+/////////////////////////////// 取消按钮(cancelBtn)//////////////////////////////
+
+/** 设置 cancelBtn 的背景颜色 */
+@property (nullable, nonatomic, strong) UIColor *cancelColor;
+
+/** 设置 cancelBtn 标题的颜色 */
+@property (nullable, nonatomic, strong) UIColor *cancelTextColor;
+
+/** 设置 cancelBtn 标题的字体 */
+@property (nullable, nonatomic, strong) UIFont *cancelTextFont;
+
+/** 设置 cancelBtn 的 frame */
+@property (nonatomic, assign) CGRect cancelBtnFrame;
+
+/** 设置 cancelBtn 的边框样式 */
+@property (nonatomic, assign) BRBorderStyle cancelBorderStyle;
+
+/** 设置 cancelBtn 的圆角大小 */
+@property (nonatomic, assign) CGFloat cancelCornerRadius;
+
+/** 设置 cancelBtn 的边框宽度 */
+@property (nonatomic, assign) CGFloat cancelBorderWidth;
+
+/** 设置 cancelBtn 的 image */
+@property (nullable, nonatomic, strong) UIImage *cancelBtnImage;
+
+/** 设置 cancelBtn 的 title */
+@property (nullable, nonatomic, copy) NSString *cancelBtnTitle;
+
+/** 隐藏 cancelBtn,默认为 NO */
+@property (nonatomic, assign) BOOL hiddenCancelBtn;
+
+
+/////////////////////////////// 确定按钮(doneBtn)////////////////////////////////
+
+/** 设置 doneBtn 的背景颜色 */
+@property (nullable, nonatomic, strong) UIColor *doneColor;
+
+/** 设置 doneBtn 标题的颜色 */
+@property (nullable, nonatomic, strong) UIColor *doneTextColor;
+
+/** 设置 doneBtn 标题的字体 */
+@property (nullable, nonatomic, strong) UIFont *doneTextFont;
+
+/** 设置 doneBtn 的 frame */
+@property (nonatomic, assign) CGRect doneBtnFrame;
+
+/** 设置 doneBtn 的边框样式 */
+@property (nonatomic, assign) BRBorderStyle doneBorderStyle;
+
+/** 设置 doneBtn 的圆角大小 */
+@property (nonatomic, assign) CGFloat doneCornerRadius;
+
+/** 设置 doneBtn 的边框宽度 */
+@property (nonatomic, assign) CGFloat doneBorderWidth;
+
+/** 设置 doneBtn 的 image */
+@property (nullable, nonatomic, strong) UIImage *doneBtnImage;
+
+/** 设置 doneBtn 的 title */
+@property (nullable, nonatomic, copy) NSString *doneBtnTitle;
+
+/** 隐藏 doneBtn,默认为 NO */
+@property (nonatomic, assign) BOOL hiddenDoneBtn;
+
+
+/////////////////////////////// 选择器(pickerView)///////////////////////////////
+
+/** 设置 picker 的背景颜色 */
+@property (nullable, nonatomic, strong) UIColor *pickerColor;
+
+/** 设置 picker 中间两条分割线的背景颜色。暂不支持日期选择器前4种类型 */
+@property (nullable, nonatomic, strong) UIColor *separatorColor;
+
+/** 设置 picker 文本的颜色。暂不支持日期选择器前4种类型 */
+@property (nullable, nonatomic, strong) UIColor *pickerTextColor;
+
+/** 设置 picker 文本的字体。暂不支持日期选择器前4种类型 */
+@property (nullable, nonatomic, strong) UIFont *pickerTextFont;
+
+/** 设置 picker 中间选中行的背景颜色。暂不支持日期选择器前4种类型 */
+@property (nullable, nonatomic, strong) UIColor *selectRowColor;
+
+/** 设置 picker 中间选中行文本的颜色。暂不支持日期选择器前4种类型 */
+@property (nullable, nonatomic, strong) UIColor *selectRowTextColor;
+
+/** 设置 picker 中间选中行文本的字体。暂不支持日期选择器前4种类型 */
+@property (nullable, nonatomic, strong) UIFont *selectRowTextFont;
+
+/** 设置 picker 的高度,系统默认高度为 216 */
+@property (nonatomic, assign) CGFloat pickerHeight;
+
+/** 设置 picker 的行高。暂不支持日期选择器前4种类型 */
+@property (nonatomic, assign) CGFloat rowHeight;
+
+
+/**
+ *  设置语言(不设置或为nil时,将随系统的语言自动改变)
+ *  language: zh-Hans(简体中文)、zh-Hant(繁体中文)、en(英语 )
+ */
+@property(nullable, nonatomic, copy) NSString *language;
+
+
+/////// 日期选择器单位样式(showUnitType == BRShowUnitTypeOnlyCenter 时生效。暂不支持日期选择器前4种类型 )///////
+
+/** 设置日期选择器单位文本的颜色 */
+@property (nullable, nonatomic, strong) UIColor *dateUnitTextColor;
+
+/** 设置日期选择器单位文本的字体 */
+@property (nullable, nonatomic, strong) UIFont *dateUnitTextFont;
+
+/** 设置日期选择器单位 label 的水平方向偏移量 */
+@property (nonatomic, assign) CGFloat dateUnitOffsetX;
+
+/** 设置日期选择器单位 label 的竖直方向偏移量 */
+@property (nonatomic, assign) CGFloat dateUnitOffsetY;
+
+
+//////////////////////////////// 常用的几种模板样式 ////////////////////////////////
+
+/// 弹框模板样式1 - 取消/确定按钮圆角样式
+/// @param themeColor 主题颜色
++ (instancetype)pickerStyleWithThemeColor:(nullable UIColor *)themeColor;
+
+/// 弹框模板样式2 - 顶部圆角样式 + 完成按钮
+/// @param doneTextColor 完成按钮标题的颜色
++ (instancetype)pickerStyleWithDoneTextColor:(nullable UIColor *)doneTextColor;
+
+/// 弹框模板样式3 - 顶部圆角样式 + 图标按钮
+/// @param doneBtnImage 完成按钮的 image
++ (instancetype)pickerStyleWithDoneBtnImage:(nullable UIImage *)doneBtnImage;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 336 - 0
Pods/BRPickerView/BRPickerView/Base/BRPickerStyle.m

@@ -0,0 +1,336 @@
+//
+//  BRPickerStyle.m
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2019/10/2.
+//  Copyright © 2019 irenb. All dones reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import "BRPickerStyle.h"
+#import "NSBundle+BRPickerView.h"
+
+// 标题颜色
+#define kBRDefaultTextColor BR_RGB_HEX(0x333333, 1.0f)
+
+@implementation BRPickerStyle
+
+/// 设置默认样式
+
+- (UIColor *)maskColor {
+    if (!_maskColor) {
+        _maskColor = [UIColor colorWithWhite:0 alpha:0.2f];
+    }
+    return _maskColor;
+}
+
+- (UIColor *)shadowLineColor {
+    if (!_shadowLineColor) {
+        if (@available(iOS 13.0, *)) {
+            // 边框线颜色,有透明度
+            _shadowLineColor = [UIColor separatorColor];
+        } else {
+            _shadowLineColor = BR_RGB_HEX(0xc6c6c8, 1.0f);
+        }
+    }
+    return _shadowLineColor;
+}
+
+- (CGFloat)shadowLineHeight {
+    if (_shadowLineHeight <= 0 || _shadowLineHeight > 5.0f) {
+        _shadowLineHeight = 0.5f;
+    }
+    return _shadowLineHeight;
+}
+
+- (CGFloat)paddingBottom {
+    if (_paddingBottom <= 0) {
+        _paddingBottom = BR_BOTTOM_MARGIN;
+    }
+    return _paddingBottom;
+}
+
+- (UIColor *)titleBarColor {
+    if (!_titleBarColor) {
+        if (@available(iOS 13.0, *)) {
+            // #ffffff(正常)、#1c1c1e(深色)
+            _titleBarColor = [UIColor secondarySystemGroupedBackgroundColor];
+        } else {
+            _titleBarColor = [UIColor whiteColor];
+        }
+    }
+    return _titleBarColor;
+}
+
+- (CGFloat)titleBarHeight {
+    if (!self.hiddenTitleBarView) {
+        if (_titleBarHeight < 44.0f && (!self.hiddenCancelBtn || !self.hiddenDoneBtn || !self.hiddenTitleLabel)) {
+            _titleBarHeight = 44.0f;
+        }
+    } else {
+        _titleBarHeight = 0;
+    }
+    return _titleBarHeight;
+}
+
+- (UIColor *)titleLineColor {
+    if (!_titleLineColor) {
+        _titleLineColor = [self br_colorWithLightColor:BR_RGB_HEX(0xededee, 1.0f) darkColor:BR_RGB_HEX(0x18181c, 1.0f)];
+    }
+    return _titleLineColor;
+}
+
+- (UIColor *)cancelColor {
+    if (!_cancelColor) {
+        _cancelColor = [UIColor clearColor];
+    }
+    return _cancelColor;
+}
+
+- (UIColor *)cancelTextColor {
+    if (!_cancelTextColor) {
+        if (@available(iOS 13.0, *)) {
+            _cancelTextColor = [UIColor labelColor];
+        } else {
+            _cancelTextColor = kBRDefaultTextColor;
+        }
+    }
+    return _cancelTextColor;
+}
+
+- (UIFont *)cancelTextFont {
+    if (!_cancelTextFont) {
+        _cancelTextFont = [UIFont systemFontOfSize:16.0f];
+    }
+    return _cancelTextFont;
+}
+
+- (NSString *)cancelBtnTitle {
+    if (!_cancelBtnTitle && !_cancelBtnImage) {
+        _cancelBtnTitle = [NSBundle br_localizedStringForKey:@"取消" language:self.language];
+    }
+    return _cancelBtnTitle;
+}
+
+- (CGRect)cancelBtnFrame {
+    if (CGRectEqualToRect(_cancelBtnFrame, CGRectZero) || _cancelBtnFrame.size.height == 0) {
+        _cancelBtnFrame = CGRectMake(5, 8, 60, 28);
+    }
+    return _cancelBtnFrame;
+}
+
+- (UIColor *)titleLabelColor {
+    if (!_titleLabelColor) {
+        _titleLabelColor = [UIColor clearColor];
+    }
+    return _titleLabelColor;
+}
+
+- (UIColor *)titleTextColor {
+    if (!_titleTextColor) {
+        if (@available(iOS 13.0, *)) {
+            _titleTextColor = [UIColor secondaryLabelColor];
+        } else {
+            _titleTextColor = BR_RGB_HEX(0x999999, 1.0f);
+        }
+    }
+    return _titleTextColor;
+}
+
+- (UIFont *)titleTextFont {
+    if (!_titleTextFont) {
+        _titleTextFont = [UIFont systemFontOfSize:15.0f];
+    }
+    return _titleTextFont;
+}
+
+- (CGRect)titleLabelFrame {
+    if (CGRectEqualToRect(_titleLabelFrame, CGRectZero) || _titleLabelFrame.size.height == 0) {
+        _titleLabelFrame = CGRectMake(5 + 60 + 2, 0, BRGetKeyWindow().bounds.size.width - 2 * (5 + 60 + 2), 44);
+    }
+    return _titleLabelFrame;
+}
+
+- (UIColor *)doneColor {
+    if (!_doneColor) {
+        _doneColor = [UIColor clearColor];
+    }
+    return _doneColor;
+}
+
+- (UIColor *)doneTextColor {
+    if (!_doneTextColor) {
+        if (@available(iOS 13.0, *)) {
+            _doneTextColor = [UIColor labelColor];
+        } else {
+            _doneTextColor = kBRDefaultTextColor;
+        }
+    }
+    return _doneTextColor;
+}
+
+- (UIFont *)doneTextFont {
+    if (!_doneTextFont) {
+        _doneTextFont = [UIFont systemFontOfSize:16.0f];
+    }
+    return _doneTextFont;
+}
+
+- (NSString *)doneBtnTitle {
+    if (!_doneBtnTitle && !_doneBtnImage) {
+        _doneBtnTitle = [NSBundle br_localizedStringForKey:@"确定" language:self.language];
+    }
+    return _doneBtnTitle;
+}
+
+- (CGRect)doneBtnFrame {
+    if (CGRectEqualToRect(_doneBtnFrame, CGRectZero) || _doneBtnFrame.size.height == 0) {
+        _doneBtnFrame = CGRectMake(BRGetKeyWindow().bounds.size.width - 60 - 5, 8, 60, 28);
+    }
+    return _doneBtnFrame;
+}
+
+- (UIColor *)pickerColor {
+    if (!_pickerColor) {
+        if (@available(iOS 13.0, *)) {
+            // #ffffff(正常)、#1c1c1e(深色)
+            _pickerColor = [UIColor secondarySystemGroupedBackgroundColor];
+        } else {
+            _pickerColor = [UIColor whiteColor];
+        }
+    }
+    return _pickerColor;
+}
+
+- (UIColor *)separatorColor {
+    if (!_separatorColor) {
+        if (@available(iOS 13.0, *)) {
+            // 分割线颜色,无透明度
+            _separatorColor = [UIColor opaqueSeparatorColor];
+        } else {
+            _separatorColor = BR_RGB_HEX(0xc6c6c8, 1.0f);
+        }
+    }
+    return _separatorColor;
+}
+
+- (UIColor *)pickerTextColor {
+    if (!_pickerTextColor) {
+        if (@available(iOS 13.0, *)) {
+            _pickerTextColor = [UIColor labelColor];
+        } else {
+            _pickerTextColor = kBRDefaultTextColor;
+        }
+    }
+    return _pickerTextColor;
+}
+
+- (UIFont *)pickerTextFont {
+    if (!_pickerTextFont) {
+        _pickerTextFont = [UIFont systemFontOfSize:18.0f];
+    }
+    return _pickerTextFont;
+}
+
+- (CGFloat)pickerHeight {
+    if (_pickerHeight < 40) {
+        _pickerHeight = 216.0f;
+    }
+    return _pickerHeight;
+}
+
+- (CGFloat)rowHeight {
+    if (_rowHeight < 20) {
+        _rowHeight = 35.0f;
+    }
+    return _rowHeight;
+}
+
+- (NSString *)language {
+    if (!_language) {
+        // 跟随系统的首选语言自动改变
+        // zh-Hans-CN(简体中文)、zh-Hant-CN(繁体中文)、en-CN(美式英语)、en-GB(英式英语)
+        // 其中`CN`是iOS9以后新增的地区代码,如:CN 代表中国,US 代表美国
+        _language = [NSLocale preferredLanguages].firstObject;
+    }
+    return _language;
+}
+
+- (UIColor *)dateUnitTextColor {
+    if (!_dateUnitTextColor) {
+        if (@available(iOS 13.0, *)) {
+            _dateUnitTextColor = [UIColor labelColor];
+        } else {
+            _dateUnitTextColor = kBRDefaultTextColor;
+        }
+    }
+    return _dateUnitTextColor;
+}
+
+- (UIFont *)dateUnitTextFont {
+    if (!_dateUnitTextFont) {
+        _dateUnitTextFont = [UIFont systemFontOfSize:18.0f];
+    }
+    return _dateUnitTextFont;
+}
+
+#pragma mark - 创建自定义动态颜色(适配深色模式)
+- (UIColor *)br_colorWithLightColor:(UIColor *)lightColor darkColor:(UIColor *)darkColor {
+    if (@available(iOS 13.0, *)) {
+        UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {
+            if ([traitCollection userInterfaceStyle] == UIUserInterfaceStyleLight) {
+                return lightColor;
+            } else {
+                return darkColor;
+            }
+        }];
+        return dyColor;
+    } else {
+        return lightColor;
+    }
+}
+
+#pragma mark - 弹框模板样式1 - 取消/确定按钮圆角样式
++ (instancetype)pickerStyleWithThemeColor:(UIColor *)themeColor {
+    BRPickerStyle *customStyle = [[self alloc]init];
+    if (themeColor) {
+        customStyle.cancelTextColor = themeColor;
+        customStyle.cancelBorderStyle = BRBorderStyleSolid;
+        customStyle.doneColor = themeColor;
+        customStyle.doneTextColor = [UIColor whiteColor];
+        customStyle.doneBorderStyle = BRBorderStyleFill;
+    }
+    return customStyle;
+}
+
+#pragma mark - 弹框模板样式2 - 顶部圆角样式 + 完成按钮
++ (instancetype)pickerStyleWithDoneTextColor:(UIColor *)doneTextColor {
+    BRPickerStyle *customStyle = [[self alloc]init];
+    if (doneTextColor) {
+        customStyle.topCornerRadius = 16.0f;
+        customStyle.hiddenCancelBtn = YES;
+        customStyle.hiddenTitleLine = YES;
+        customStyle.titleLabelFrame = CGRectMake(20, 4, 100, 40);
+        customStyle.doneTextColor = doneTextColor;
+        customStyle.doneTextFont = [UIFont boldSystemFontOfSize:16.0f];
+        customStyle.doneBtnFrame = CGRectMake(BRGetKeyWindow().bounds.size.width - 60, 4, 60, 40);
+        customStyle.doneBtnTitle = [NSBundle br_localizedStringForKey:@"完成" language:customStyle.language];
+    }
+    return customStyle;
+}
+
+#pragma mark - 弹框模板样式3 - 顶部圆角样式 + 图标按钮
++ (instancetype)pickerStyleWithDoneBtnImage:(UIImage *)doneBtnImage {
+    BRPickerStyle *customStyle = [[self alloc]init];
+    if (doneBtnImage) {
+        customStyle.topCornerRadius = 16.0f;
+        customStyle.hiddenTitleLine = YES;
+        customStyle.hiddenCancelBtn = YES;
+        customStyle.titleLabelFrame = CGRectMake(20, 4, 100, 40);
+        customStyle.doneBtnImage = doneBtnImage;
+        customStyle.doneBtnFrame = CGRectMake(BRGetKeyWindow().bounds.size.width - 44, 4, 40, 40);
+    }
+    return customStyle;
+}
+
+@end

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 13634 - 0
Pods/BRPickerView/BRPickerView/Base/BRPickerView.bundle/BRCity.json


+ 32 - 0
Pods/BRPickerView/BRPickerView/Base/BRPickerView.bundle/en.lproj/Localizable.strings

@@ -0,0 +1,32 @@
+/* 
+  Localizable.strings
+  BRPickerViewDemo
+
+  Created by renbo on 2019/10/30.
+  Copyright © 2019 irenb. All rights reserved.
+*/
+
+"确定" = "OK";
+"取消" = "Cancel";
+"完成" = "Done";
+
+"年" = " ";
+"月" = " ";
+"日" = " ";
+"时" = " ";
+"分" = " ";
+"秒" = " ";
+
+"上午" = "AM";
+"下午" = "PM";
+
+"至今" = " Now";
+"今天" = " Today";
+
+"周一" = " Mon";
+"周二" = " Tue";
+"周三" = " Wed";
+"周四" = " Thu";
+"周五" = " Fri";
+"周六" = " Sat";
+"周日" = " Sun";

+ 32 - 0
Pods/BRPickerView/BRPickerView/Base/BRPickerView.bundle/zh-Hans.lproj/Localizable.strings

@@ -0,0 +1,32 @@
+/* 
+  Localizable.strings
+  BRPickerViewDemo
+
+  Created by renbo on 2019/10/30.
+  Copyright © 2019 irenb. All rights reserved.
+*/
+
+"确定" = "确定";
+"取消" = "取消";
+"完成" = "完成";
+
+"年" = "年";
+"月" = "月";
+"日" = "日";
+"时" = "时";
+"分" = "分";
+"秒" = "秒";
+
+"上午" = "上午";
+"下午" = "下午";
+
+"至今" = "至今";
+"今天" = "今天";
+
+"周一" = "周一";
+"周二" = "周二";
+"周三" = "周三";
+"周四" = "周四";
+"周五" = "周五";
+"周六" = "周六";
+"周日" = "周日";

+ 32 - 0
Pods/BRPickerView/BRPickerView/Base/BRPickerView.bundle/zh-Hant.lproj/Localizable.strings

@@ -0,0 +1,32 @@
+/* 
+  Localizable.strings
+  BRPickerViewDemo
+
+  Created by renbo on 2019/10/30.
+  Copyright © 2019 irenb. All rights reserved.
+*/
+
+"确定" = "確定";
+"取消" = "取消";
+"完成" = "完成";
+
+"年" = "年";
+"月" = "月";
+"日" = "日";
+"时" = "時";
+"分" = "分";
+"秒" = "秒";
+
+"上午" = "上午";
+"下午" = "下午";
+
+"至今" = "至今";
+"今天" = "今天";
+
+"周一" = "周壹";
+"周二" = "周二";
+"周三" = "周三";
+"周四" = "周四";
+"周五" = "周五";
+"周六" = "周六";
+"周日" = "周日";

+ 125 - 0
Pods/BRPickerView/BRPickerView/Base/BRPickerViewMacro.h

@@ -0,0 +1,125 @@
+//
+//  BRPickerViewMacro.h
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2018/4/23.
+//  Copyright © 2018 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#ifndef BRPickerViewMacro_h
+#define BRPickerViewMacro_h
+
+#import <UIKit/UIKit.h>
+
+// 底部安全区域高度
+#define BR_BOTTOM_MARGIN \
+({CGFloat safeBottomHeight = 0;\
+if (@available(iOS 11.0, *)) {\
+safeBottomHeight = BRGetKeyWindow().safeAreaInsets.bottom;\
+}\
+(safeBottomHeight);})
+
+
+// 静态库中编写 Category 时的便利宏,用于解决 Category 方法从静态库中加载需要特别设置的问题
+#ifndef BRSYNTH_DUMMY_CLASS
+
+#define BRSYNTH_DUMMY_CLASS(_name_) \
+@interface BRSYNTH_DUMMY_CLASS_ ## _name_ : NSObject @end \
+@implementation BRSYNTH_DUMMY_CLASS_ ## _name_ @end
+
+#endif
+
+
+// 打印错误日志
+#ifdef DEBUG
+    #define BRErrorLog(...) NSLog(@"reason: %@", [NSString stringWithFormat:__VA_ARGS__])
+#else
+    #define BRErrorLog(...)
+#endif
+
+
+/**
+ 弱引用/强引用
+ 
+ Example:
+     @weakify(self)
+     [self doSomething^{
+         @strongify(self)
+         if (!self) return;
+         ...
+     }];
+ 
+ */
+#ifndef weakify
+    #if DEBUG
+        #if __has_feature(objc_arc)
+            #define weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object;
+        #else
+            #define weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object;
+        #endif
+    #else
+        #if __has_feature(objc_arc)
+            #define weakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object;
+        #else
+            #define weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object;
+        #endif
+    #endif
+#endif
+
+#ifndef strongify
+    #if DEBUG
+        #if __has_feature(objc_arc)
+            #define strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object;
+        #else
+            #define strongify(object) autoreleasepool{} __typeof__(object) object = block##_##object;
+        #endif
+    #else
+        #if __has_feature(objc_arc)
+            #define strongify(object) try{} @finally{} __typeof__(object) object = weak##_##object;
+        #else
+            #define strongify(object) try{} @finally{} __typeof__(object) object = block##_##object;
+        #endif
+    #endif
+#endif
+
+
+/** RGB颜色(16进制) */
+static inline UIColor *BR_RGB_HEX(uint32_t rgbValue, CGFloat alpha) {
+    return [UIColor colorWithRed:((CGFloat)((rgbValue & 0xFF0000) >> 16)) / 255.0
+                           green:((CGFloat)((rgbValue & 0xFF00) >> 8)) / 255.0
+                            blue:((CGFloat)(rgbValue & 0xFF)) / 255.0
+                           alpha:(alpha)];
+}
+
+
+/** 获取 keyWindow */
+static inline UIWindow *BRGetKeyWindow(void) {
+    UIWindow *keyWindow = nil;
+#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 // 编译时检查SDK版本:Xcode11+编译会调用(iOS SDK 13.0 以后版本的处理)
+    if (@available(iOS 13.0, *)) {
+        NSSet<UIScene *> *connectedScenes = [UIApplication sharedApplication].connectedScenes;
+        for (UIScene *scene in connectedScenes) {
+            if (scene.activationState == UISceneActivationStateForegroundActive && [scene isKindOfClass:[UIWindowScene class]]) {
+                UIWindowScene *windowScene = (UIWindowScene *)scene;
+                for (UIWindow *window in windowScene.windows) {
+                    if (window.isKeyWindow) {
+                        keyWindow = window;
+                        break;
+                    }
+                }
+            }
+        }
+    } else
+#endif
+    {
+#if __IPHONE_OS_VERSION_MIN_REQUIRED < 130000
+        return [UIApplication sharedApplication].keyWindow;
+#endif
+    }
+    
+    return keyWindow;
+}
+
+
+#endif /* BRPickerViewMacro_h */

+ 29 - 0
Pods/BRPickerView/BRPickerView/Base/NSBundle+BRPickerView.h

@@ -0,0 +1,29 @@
+//
+//  NSBundle+BRPickerView.h
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2019/10/30.
+//  Copyright © 2019 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NSBundle (BRPickerView)
+
+/// 获取 BRPickerView.bundle
++ (instancetype)br_pickerBundle;
+
+/// 获取城市JSON数据
++ (NSArray *)br_addressJsonArray;
+
+/// 获取国际化后的文本
+/// @param key 代表 Localizable.strings 文件中 key-value 中的 key。
+/// @param language 设置语言(可为空,为nil时将随系统的语言自动改变)
++ (NSString *)br_localizedStringForKey:(NSString *)key language:(NSString *)language;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 80 - 0
Pods/BRPickerView/BRPickerView/Base/NSBundle+BRPickerView.m

@@ -0,0 +1,80 @@
+//
+//  NSBundle+BRPickerView.m
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2019/10/30.
+//  Copyright © 2019 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import "NSBundle+BRPickerView.h"
+#import "BRBaseView.h"
+
+BRSYNTH_DUMMY_CLASS(NSBundle_BRPickerView)
+
+@implementation NSBundle (BRPickerView)
+
+#pragma mark - 获取 BRPickerView.bundle
++ (instancetype)br_pickerBundle {
+    static NSBundle *pickerBundle = nil;
+    if (pickerBundle == nil) {
+        /*
+            先拿到最外面的 bundle。
+            对 framework 链接方式来说就是 framework 的 bundle 根目录,
+            对静态库链接方式来说就是 target client 的 main bundle,
+            然后再去找下面名为 BRPickerView 的 bundle 对象。
+         */
+        NSBundle *bundle = [NSBundle bundleForClass:[BRBaseView class]];
+        NSURL *url = [bundle URLForResource:@"BRPickerView" withExtension:@"bundle"];
+        pickerBundle = [NSBundle bundleWithURL:url];
+    }
+    return pickerBundle;
+}
+
+#pragma mark - 获取城市JSON数据
++ (NSArray *)br_addressJsonArray {
+    static NSArray *cityArray = nil;
+    if (cityArray == nil) {
+        // 获取本地JSON文件
+        NSString *filePath = [[self br_pickerBundle] pathForResource:@"BRCity" ofType:@"json"];
+        NSData *data = [NSData dataWithContentsOfFile:filePath];
+        cityArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
+    }
+    return cityArray;
+}
+
+#pragma mark - 获取国际化后的文本
++ (NSString *)br_localizedStringForKey:(NSString *)key language:(NSString *)language {
+    return [self br_localizedStringForKey:key value:nil language:language];
+}
+
++ (NSString *)br_localizedStringForKey:(NSString *)key value:(NSString *)value language:(NSString *)language {
+    static NSBundle *bundle = nil;
+    if (bundle == nil) {
+        // 如果没有手动设置语言,将随系统的语言自动改变
+        if (!language) {
+            // 系统首选语言
+            language = [NSLocale preferredLanguages].firstObject;
+        }
+        
+        if ([language hasPrefix:@"en"]) {
+            language = @"en";
+        } else if ([language hasPrefix:@"zh"]) {
+            if ([language rangeOfString:@"Hans"].location != NSNotFound) {
+                language = @"zh-Hans"; // 简体中文
+            } else { // zh-Hant、zh-HK、zh-TW
+                language = @"zh-Hant"; // 繁體中文
+            }
+        } else {
+            language = @"en";
+        }
+        
+        // 从 BRPickerView.bundle 中查找资源
+        bundle = [NSBundle bundleWithPath:[[self br_pickerBundle] pathForResource:language ofType:@"lproj"]];
+    }
+    value = [bundle localizedStringForKey:key value:value table:nil];
+    
+    return [[NSBundle mainBundle] localizedStringForKey:key value:value table:nil];
+}
+
+@end

+ 97 - 0
Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView+BR.h

@@ -0,0 +1,97 @@
+//
+//  BRDatePickerView+BR.h
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2020/6/16.
+//  Copyright © 2020 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import "BRDatePickerView.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface BRDatePickerView (BR)
+
+/** 最小日期 */
+- (NSDate *)handlerMinDate:(nullable NSDate *)minDate;
+
+/** 最大日期 */
+- (NSDate *)handlerMaxDate:(nullable NSDate *)maxDate;
+
+/** 默认选中的日期 */
+- (NSDate *)handlerSelectDate:(nullable NSDate *)selectDate dateFormat:(NSString *)dateFormat;
+
+/** NSDate 转 NSString */
+- (NSString *)br_stringFromDate:(NSDate *)date dateFormat:(NSString *)dateFormat;
+
+/** NSString 转 NSDate */
+- (NSDate *)br_dateFromString:(NSString *)dateString dateFormat:(NSString *)dateFormat;
+
+/** 比较两个时间大小(可以指定比较级数,即按指定格式进行比较) */
+- (NSComparisonResult)br_compareDate:(NSDate *)date targetDate:(NSDate *)targetDate dateFormat:(NSString *)dateFormat;
+
+/** 获取 yearArr 数组 */
+- (NSArray *)getYearArr;
+
+/** 获取 monthArr 数组 */
+- (NSArray *)getMonthArr:(NSInteger)year;
+
+/** 获取 dayArr 数组 */
+- (NSArray *)getDayArr:(NSInteger)year month:(NSInteger)month;
+
+/** 获取 hourArr 数组 */
+- (NSArray *)getHourArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day;
+
+/** 获取 minuteArr 数组 */
+- (NSArray *)getMinuteArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour;
+
+/** 获取 secondArr 数组 */
+- (NSArray *)getSecondArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute;
+
+/** 添加 pickerView */
+- (void)setupPickerView:(UIView *)pickerView toView:(UIView *)view;
+
+/** 设置时间单位 */
+- (NSArray *)setupPickerUnitLabel:(UIPickerView *)pickerView unitArr:(NSArray *)unitArr;
+
+/** 设置选择器中间选中行的样式 */
+- (void)setupPickerSelectRowStyle:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
+
+- (NSString *)getYearNumber:(NSInteger)year;
+
+- (NSString *)getMDHMSNumber:(NSInteger)number;
+
+- (NSString *)getYearText:(NSArray *)yearArr row:(NSInteger)row;
+
+- (NSString *)getMonthText:(NSArray *)monthArr row:(NSInteger)row monthNames:(NSArray *)monthNames;
+
+- (NSString *)getDayText:(NSArray *)dayArr row:(NSInteger)row mSelectDate:(NSDate *)mSelectDate;
+
+- (NSString *)getHourText:(NSArray *)hourArr row:(NSInteger)row;
+
+- (NSString *)getMinuteText:(NSArray *)minuteArr row:(NSInteger)row;
+
+- (NSString *)getSecondText:(NSArray *)secondArr row:(NSInteger)row;
+
+- (NSString *)getAMText;
+
+- (NSString *)getPMText;
+
+- (NSString *)getYearUnit;
+
+- (NSString *)getMonthUnit;
+
+- (NSString *)getDayUnit;
+
+- (NSString *)getHourUnit;
+
+- (NSString *)getMinuteUnit;
+
+- (NSString *)getSecondUnit;
+
+- (NSInteger)getIndexWithArray:(NSArray *)array object:(NSString *)obj;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 635 - 0
Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView+BR.m

@@ -0,0 +1,635 @@
+//
+//  BRDatePickerView+BR.m
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2020/6/16.
+//  Copyright © 2020 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import "BRDatePickerView+BR.h"
+#import "NSBundle+BRPickerView.h"
+
+BRSYNTH_DUMMY_CLASS(BRDatePickerView_BR)
+
+//////////////////////////////////////////
+/// 本分类主要是给 BRDatePickerView 文件瘦身
+//////////////////////////////////////////
+
+@implementation BRDatePickerView (BR)
+
+#pragma mark - 最小日期
+- (NSDate *)handlerMinDate:(NSDate *)minDate {
+    if (!minDate) {
+        if (self.pickerMode == BRDatePickerModeMDHM) {
+            minDate = [NSDate br_setMonth:1 day:1 hour:0 minute:0];
+        } else if (self.pickerMode == BRDatePickerModeMD) {
+            minDate = [NSDate br_setMonth:1 day:1];
+        } else if (self.pickerMode == BRDatePickerModeTime || self.pickerMode == BRDatePickerModeCountDownTimer || self.pickerMode == BRDatePickerModeHM) {
+            minDate = [NSDate br_setHour:0 minute:0];
+        } else if (self.pickerMode == BRDatePickerModeHMS) {
+            minDate = [NSDate br_setHour:0 minute:0 second:0];
+        } else if (self.pickerMode == BRDatePickerModeMS) {
+            minDate = [NSDate br_setMinute:0 second:0];
+        } else {
+            minDate = [NSDate distantPast]; // 遥远的过去的一个时间点
+        }
+    }
+    return minDate;
+}
+
+#pragma mark - 最大日期
+- (NSDate *)handlerMaxDate:(NSDate *)maxDate {
+    if (!maxDate) {
+        if (self.pickerMode == BRDatePickerModeMDHM) {
+            maxDate = [NSDate br_setMonth:12 day:31 hour:23 minute:59];
+        } else if (self.pickerMode == BRDatePickerModeMD) {
+            maxDate = [NSDate br_setMonth:12 day:31];
+        } else if (self.pickerMode == BRDatePickerModeTime || self.pickerMode == BRDatePickerModeCountDownTimer || self.pickerMode == BRDatePickerModeHM) {
+            maxDate = [NSDate br_setHour:23 minute:59];
+        } else if (self.pickerMode == BRDatePickerModeHMS) {
+            maxDate = [NSDate br_setHour:23 minute:59 second:59];
+        } else if (self.pickerMode == BRDatePickerModeMS) {
+            maxDate = [NSDate br_setMinute:59 second:59];
+        } else {
+            maxDate = [NSDate distantFuture]; // 遥远的未来的一个时间点
+        }
+    }
+    return maxDate;
+}
+
+#pragma mark - 默认选中的日期
+- (NSDate *)handlerSelectDate:(NSDate *)selectDate dateFormat:(NSString *)dateFormat {
+    // selectDate 优先级高于 selectValue(推荐使用 selectDate 设置默认选中的时间)
+    if (!selectDate) {
+        if (self.selectValue && self.selectValue.length > 0) {
+            if (self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM) {
+                NSString *firstString = [[self.selectValue componentsSeparatedByString:@" "] firstObject];
+                NSString *lastString = [[self.selectValue componentsSeparatedByString:@" "] lastObject];
+                if ([lastString isEqualToString:[self getAMText]]) {
+                    self.selectValue = [NSString stringWithFormat:@"%@ 00", firstString];
+                }
+                if ([lastString isEqualToString:[self getPMText]]) {
+                    self.selectValue = [NSString stringWithFormat:@"%@ 12", firstString];
+                }
+            }
+            
+            NSDate *date = ![self.selectValue isEqualToString:self.addCustomString] ? [self br_dateFromString:self.selectValue dateFormat:dateFormat] : [NSDate date];
+            if (!date) {
+                BRErrorLog(@"参数异常!字符串 selectValue 的正确格式是:%@", dateFormat);
+                NSAssert(date, @"参数异常!请检查字符串 selectValue 的格式");
+                date = [NSDate date]; // 默认值参数格式错误时,重置/忽略默认值,防止在 Release 环境下崩溃!
+            }
+            
+            if (self.pickerMode == BRDatePickerModeMDHM) {
+                selectDate = [NSDate br_setMonth:date.br_month day:date.br_day hour:date.br_hour minute:date.br_minute];
+            } else if (self.pickerMode == BRDatePickerModeMD) {
+                selectDate = [NSDate br_setMonth:date.br_month day:date.br_day];
+            } else if (self.pickerMode == BRDatePickerModeTime || self.pickerMode == BRDatePickerModeCountDownTimer || self.pickerMode == BRDatePickerModeHM) {
+                selectDate = [NSDate br_setHour:date.br_hour minute:date.br_minute];
+            } else if (self.pickerMode == BRDatePickerModeHMS) {
+                selectDate = [NSDate br_setHour:date.br_hour minute:date.br_minute second:date.br_second];
+            } else if (self.pickerMode == BRDatePickerModeMS) {
+                selectDate = [NSDate br_setMinute:date.br_minute second:date.br_second];
+            } else {
+                selectDate = date;
+            }
+        } else {
+            // 不设置默认日期
+            if (self.pickerMode == BRDatePickerModeTime ||
+                self.pickerMode == BRDatePickerModeCountDownTimer ||
+                self.pickerMode == BRDatePickerModeHM ||
+                self.pickerMode == BRDatePickerModeHMS ||
+                self.pickerMode == BRDatePickerModeMS) {
+                // 默认选中最小时间
+                selectDate = self.minDate;
+            } else {
+                if (self.minuteInterval > 1 || self.secondInterval > 1) {
+                    NSDate *date = [NSDate date];
+                    NSInteger minute = self.minDate.br_minute % self.minuteInterval == 0 ? self.minDate.br_minute : 0;
+                    NSInteger second = self.minDate.br_second % self.secondInterval == 0 ? self.minDate.br_second : 0;
+                    selectDate = [NSDate br_setYear:date.br_year month:date.br_month day:date.br_day hour:date.br_hour minute:minute second:second];
+                } else {
+                    // 默认选中今天的时间
+                    selectDate = [NSDate date];
+                }
+            }
+        }
+    }
+    
+    // 判断日期是否超过边界限制
+    BOOL selectLessThanMin = [self br_compareDate:selectDate targetDate:self.minDate dateFormat:dateFormat] == NSOrderedAscending;
+    BOOL selectMoreThanMax = [self br_compareDate:selectDate targetDate:self.maxDate dateFormat:dateFormat] == NSOrderedDescending;
+    if (selectLessThanMin) {
+        BRErrorLog(@"默认选择的日期不能小于最小日期!");
+        selectDate = self.minDate;
+    }
+    if (selectMoreThanMax) {
+        BRErrorLog(@"默认选择的日期不能大于最大日期!");
+        selectDate = self.maxDate;
+    }
+    
+    return selectDate;
+}
+
+#pragma mark - NSDate 转 NSString
+- (NSString *)br_stringFromDate:(NSDate *)date dateFormat:(NSString *)dateFormat {
+    return [NSDate br_stringFromDate:date dateFormat:dateFormat timeZone:self.timeZone language:self.pickerStyle.language];
+}
+
+#pragma mark - NSString 转 NSDate
+- (NSDate *)br_dateFromString:(NSString *)dateString dateFormat:(NSString *)dateFormat {
+    return [NSDate br_dateFromString:dateString dateFormat:dateFormat timeZone:self.timeZone language:self.pickerStyle.language];
+}
+
+#pragma mark - 比较两个时间大小(可以指定比较级数,即按指定格式进行比较)
+- (NSComparisonResult)br_compareDate:(NSDate *)date targetDate:(NSDate *)targetDate dateFormat:(NSString *)dateFormat {
+    NSString *dateString1 = [self br_stringFromDate:date dateFormat:dateFormat];
+    NSString *dateString2 = [self br_stringFromDate:targetDate dateFormat:dateFormat];
+    NSDate *date1 = [self br_dateFromString:dateString1 dateFormat:dateFormat];
+    NSDate *date2 = [self br_dateFromString:dateString2 dateFormat:dateFormat];
+    if ([date1 compare:date2] == NSOrderedDescending) {
+        return 1; // 大于
+    } else if ([date1 compare:date2] == NSOrderedAscending) {
+        return -1; // 小于
+    } else {
+        return 0; // 等于
+    }
+}
+
+#pragma mark - 获取 yearArr 数组
+- (NSArray *)getYearArr {
+    NSMutableArray *tempArr = [[NSMutableArray alloc]init];
+    for (NSInteger i = self.minDate.br_year; i <= self.maxDate.br_year; i++) {
+        [tempArr addObject:[self getYearNumber:i]];
+    }
+    // 判断是否需要添加【自定义字符串】
+    if (self.addCustomString) {
+        switch (self.pickerMode) {
+            case BRDatePickerModeYMDHMS:
+            case BRDatePickerModeYMDHM:
+            case BRDatePickerModeYMDH:
+            case BRDatePickerModeYMD:
+            case BRDatePickerModeYM:
+            case BRDatePickerModeY:
+            {
+                [tempArr addObject:self.addCustomString];
+            }
+                break;
+                
+            default:
+                break;
+        }
+    }
+    if (self.isDescending) {
+        return [[[tempArr copy] reverseObjectEnumerator] allObjects];
+    }
+    
+    return [tempArr copy];
+}
+
+#pragma mark - 获取 monthArr 数组
+- (NSArray *)getMonthArr:(NSInteger)year {
+    NSInteger startMonth = 1;
+    NSInteger endMonth = 12;
+    if (year == self.minDate.br_year) {
+        startMonth = self.minDate.br_month;
+    }
+    if (year == self.maxDate.br_year) {
+        endMonth = self.maxDate.br_month;
+    }
+    NSMutableArray *tempArr = [[NSMutableArray alloc]init];
+    for (NSInteger i = startMonth; i <= endMonth; i++) {
+        [tempArr addObject:[self getMDHMSNumber:i]];
+    }
+    // 判断是否需要添加【自定义字符串】
+    if (self.addCustomString) {
+        switch (self.pickerMode) {
+            case BRDatePickerModeMDHM:
+            case BRDatePickerModeMD:
+            {
+                [tempArr addObject:self.addCustomString];
+            }
+                break;
+                
+            default:
+                break;
+        }
+    }
+    if (self.isDescending) {
+        return [[[tempArr copy] reverseObjectEnumerator] allObjects];
+    }
+    
+    return [tempArr copy];
+}
+
+#pragma mark - 获取 dayArr 数组
+- (NSArray *)getDayArr:(NSInteger)year month:(NSInteger)month {
+    NSInteger startDay = 1;
+    NSInteger endDay = [NSDate br_getDaysInYear:year month:month];
+    if (year == self.minDate.br_year && month == self.minDate.br_month) {
+        startDay = self.minDate.br_day;
+    }
+    if (year == self.maxDate.br_year && month == self.maxDate.br_month) {
+        endDay = self.maxDate.br_day;
+    }
+    NSMutableArray *tempArr = [[NSMutableArray alloc]init];
+    for (NSInteger i = startDay; i <= endDay; i++) {
+        [tempArr addObject:[self getMDHMSNumber:i]];
+    }
+    if (self.isDescending) {
+        return [[[tempArr copy] reverseObjectEnumerator] allObjects];
+    }
+    
+    return [tempArr copy];
+}
+
+#pragma mark - 获取 hourArr 数组
+- (NSArray *)getHourArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day {
+    if (self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM) {
+        return @[[self getAMText], [self getPMText]];
+    }
+    
+    NSInteger startHour = 0;
+    NSInteger endHour = 23;
+    if (year == self.minDate.br_year && month == self.minDate.br_month && day == self.minDate.br_day) {
+        startHour = self.minDate.br_hour;
+    }
+    if (year == self.maxDate.br_year && month == self.maxDate.br_month && day == self.maxDate.br_day) {
+        endHour = self.maxDate.br_hour;
+    }
+    NSMutableArray *tempArr = [[NSMutableArray alloc]init];
+    for (NSInteger i = startHour; i <= endHour; i++) {
+        [tempArr addObject:[self getMDHMSNumber:i]];
+    }
+    // 判断是否需要添加【自定义字符串】
+    if (self.addCustomString) {
+        switch (self.pickerMode) {
+            case BRDatePickerModeHMS:
+            case BRDatePickerModeHM:
+            {
+                [tempArr addObject:self.addCustomString];
+            }
+                break;
+                
+            default:
+                break;
+        }
+    }
+    if (self.isDescending) {
+        return [[[tempArr copy] reverseObjectEnumerator] allObjects];
+    }
+    
+    return [tempArr copy];
+}
+
+#pragma mark - 获取 minuteArr 数组
+- (NSArray *)getMinuteArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour {
+    NSInteger startMinute = 0;
+    NSInteger endMinute = 59;
+    if (year == self.minDate.br_year && month == self.minDate.br_month && day == self.minDate.br_day && hour == self.minDate.br_hour) {
+        startMinute = self.minDate.br_minute;
+    }
+    if (year == self.maxDate.br_year && month == self.maxDate.br_month && day == self.maxDate.br_day && hour == self.maxDate.br_hour) {
+        endMinute = self.maxDate.br_minute;
+    }
+    NSMutableArray *tempArr = [[NSMutableArray alloc]init];
+    for (NSInteger i = startMinute; i <= endMinute; i += self.minuteInterval) {
+        [tempArr addObject:[self getMDHMSNumber:i]];
+    }
+    // 判断是否需要添加【自定义字符串】
+    if (self.addCustomString) {
+        switch (self.pickerMode) {
+            case BRDatePickerModeMS:
+            {
+                [tempArr addObject:self.addCustomString];
+            }
+                break;
+                
+            default:
+                break;
+        }
+    }
+    if (self.isDescending) {
+        return [[[tempArr copy] reverseObjectEnumerator] allObjects];
+    }
+    
+    return [tempArr copy];
+}
+
+#pragma mark - 获取 secondArr 数组
+- (NSArray *)getSecondArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute {
+    NSInteger startSecond = 0;
+    NSInteger endSecond = 59;
+    if (year == self.minDate.br_year && month == self.minDate.br_month && day == self.minDate.br_day && hour == self.minDate.br_hour && minute == self.minDate.br_minute) {
+        startSecond = self.minDate.br_second;
+    }
+    if (year == self.maxDate.br_year && month == self.maxDate.br_month && day == self.maxDate.br_day && hour == self.maxDate.br_hour && minute == self.maxDate.br_minute) {
+        endSecond = self.maxDate.br_second;
+    }
+    NSMutableArray *tempArr = [[NSMutableArray alloc]init];
+    for (NSInteger i = startSecond; i <= endSecond; i += self.secondInterval) {
+        [tempArr addObject:[self getMDHMSNumber:i]];
+    }
+    if (self.isDescending) {
+        return [[[tempArr copy] reverseObjectEnumerator] allObjects];
+    }
+    
+    return [tempArr copy];
+}
+
+#pragma mark - 添加 pickerView
+- (void)setupPickerView:(UIView *)pickerView toView:(UIView *)view {
+    if (view) {
+        // 立即刷新容器视图 view 的布局(防止 view 使用自动布局时,选择器视图无法正常显示)
+        [view setNeedsLayout];
+        [view layoutIfNeeded];
+        
+        self.frame = view.bounds;
+        CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
+        CGFloat pickerFooterViewHeight = self.pickerFooterView ? self.pickerFooterView.bounds.size.height : 0;
+        pickerView.frame = CGRectMake(0, pickerHeaderViewHeight, view.bounds.size.width, view.bounds.size.height - pickerHeaderViewHeight - pickerFooterViewHeight);
+        [self addSubview:pickerView];
+    } else {
+        [self.alertView addSubview:pickerView];
+    }
+}
+
+#pragma mark - 获取时间单位
+- (NSArray *)setupPickerUnitLabel:(UIPickerView *)pickerView unitArr:(NSArray *)unitArr {
+    NSMutableArray *tempArr = [[NSMutableArray alloc]init];
+    for (NSInteger i = 0; i < pickerView.numberOfComponents; i++) {
+        // label宽度
+        CGFloat labelWidth = pickerView.bounds.size.width / pickerView.numberOfComponents;
+        // 根据占位文本长度去计算宽度
+        NSString *tempText = @"00";
+        if (i == 0) {
+            switch (self.pickerMode) {
+                case BRDatePickerModeYMDHMS:
+                case BRDatePickerModeYMDHM:
+                case BRDatePickerModeYMDH:
+                case BRDatePickerModeYMD:
+                case BRDatePickerModeYM:
+                case BRDatePickerModeY:
+                {
+                    tempText = @"0123";
+                }
+                    break;
+                    
+                default:
+                    break;
+            }
+        }
+        // 文本宽度
+        CGFloat labelTextWidth = [tempText boundingRectWithSize:CGSizeMake(MAXFLOAT, self.pickerStyle.rowHeight)
+                                                        options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
+                                                     attributes:@{NSFontAttributeName: self.pickerStyle.pickerTextFont}
+                                                        context:nil].size.width;
+        // 单位label
+        UILabel *unitLabel = [[UILabel alloc]init];
+        unitLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
+        unitLabel.backgroundColor = [UIColor clearColor];
+        unitLabel.textAlignment = NSTextAlignmentCenter;
+        unitLabel.font = self.pickerStyle.dateUnitTextFont;
+        unitLabel.textColor = self.pickerStyle.dateUnitTextColor;
+        // 字体自适应属性
+        unitLabel.adjustsFontSizeToFitWidth = YES;
+        // 自适应最小字体缩放比例
+        unitLabel.minimumScaleFactor = 0.5f;
+        unitLabel.text = (unitArr.count > 0 && i < unitArr.count) ? unitArr[i] : nil;
+        
+        CGFloat originX = i * labelWidth + labelWidth / 2.0 + labelTextWidth / 2.0 + self.pickerStyle.dateUnitOffsetX;
+        CGFloat originY = (pickerView.frame.size.height - self.pickerStyle.rowHeight) / 2 + self.pickerStyle.dateUnitOffsetY;
+        unitLabel.frame = CGRectMake(originX, originY, self.pickerStyle.rowHeight, self.pickerStyle.rowHeight);
+        
+        [tempArr addObject:unitLabel];
+        
+        [pickerView addSubview:unitLabel];
+    }
+    
+    return [tempArr copy];
+}
+
+#pragma mark - 设置选择器中间选中行的样式
+- (void)setupPickerSelectRowStyle:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
+    // 1.设置分割线的颜色
+    for (UIView *subView in pickerView.subviews) {
+        if (subView && [subView isKindOfClass:[UIView class]] && subView.frame.size.height <= 1) {
+            subView.backgroundColor = self.pickerStyle.separatorColor;
+        }
+    }
+    
+    // 2.设置选择器中间选中行的背景颜色
+    if (self.pickerStyle.selectRowColor) {
+        UIView *contentView = nil;
+        NSArray *subviews = pickerView.subviews;
+        if (subviews.count > 0) {
+            id obj = subviews.firstObject;
+            if (obj && [obj isKindOfClass:[UIView class]]) {
+                contentView = (UIView *)obj;
+            }
+        }
+        UIView *columnView = nil;
+        if (contentView) {
+            id obj = [contentView valueForKey:@"subviewCache"];
+            if (obj && [obj isKindOfClass:[NSArray class]]) {
+                NSArray *columnViews = (NSArray *)obj;
+                if (columnViews.count > 0) {
+                    id columnObj = columnViews.firstObject;
+                    if (columnObj && [columnObj isKindOfClass:[UIView class]]) {
+                        columnView = (UIView *)columnObj;
+                    }
+                }
+            }
+        }
+        if (columnView) {
+            id obj = [columnView valueForKey:@"middleContainerView"];
+            if (obj && [obj isKindOfClass:[UIView class]]) {
+                UIView *selectRowView = (UIView *)obj;
+                selectRowView.backgroundColor = self.pickerStyle.selectRowColor;
+            }
+        }
+    }
+    
+    // 3.设置选择器中间选中行的字体颜色/字体大小
+    if (self.pickerStyle.selectRowTextColor || self.pickerStyle.selectRowTextFont) {
+        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+            // 当前选中的 label
+            UILabel *selectLabel = (UILabel *)[pickerView viewForRow:row forComponent:component];
+            if (selectLabel) {
+                if (self.pickerStyle.selectRowTextColor) {
+                    selectLabel.textColor = self.pickerStyle.selectRowTextColor;
+                }
+                if (self.pickerStyle.selectRowTextFont) {
+                    selectLabel.font = self.pickerStyle.selectRowTextFont;
+                }
+            }
+        });
+    }
+}
+
+- (NSString *)getYearNumber:(NSInteger)year {
+    NSString *yearString = [NSString stringWithFormat:@"%@", @(year)];
+    if (self.isNumberFullName) {
+        yearString = [NSString stringWithFormat:@"%04d", [yearString intValue]];
+    }
+    return yearString;
+}
+
+- (NSString *)getMDHMSNumber:(NSInteger)number {
+    NSString *string = [NSString stringWithFormat:@"%@", @(number)];
+    if (self.isNumberFullName) {
+        string = [NSString stringWithFormat:@"%02d", [string intValue]];
+    }
+    return string;
+}
+
+- (NSString *)getYearText:(NSArray *)yearArr row:(NSInteger)row {
+    NSInteger index = 0;
+    if (row >= 0) {
+        index = MIN(row, yearArr.count - 1);
+    }
+    NSString *yearString = [yearArr objectAtIndex:index];
+    if (self.addCustomString && [yearString isEqualToString:self.addCustomString]) {
+        return yearString;
+    }
+    NSString *yearUnit = self.showUnitType == BRShowUnitTypeAll ? [self getYearUnit] : @"";
+    return [NSString stringWithFormat:@"%@%@", yearString, yearUnit];
+}
+
+- (NSString *)getMonthText:(NSArray *)monthArr row:(NSInteger)row monthNames:(NSArray *)monthNames {
+    NSInteger index = 0;
+    if (row >= 0) {
+        index = MIN(row, monthArr.count - 1);
+    }
+    NSString *monthString = [monthArr objectAtIndex:index];
+    if ([self.pickerStyle.language hasPrefix:@"zh"]) {
+        self.monthNameType = BRMonthNameTypeNumber;
+    }
+    if (self.monthNameType != BRMonthNameTypeNumber && (self.pickerMode == BRDatePickerModeYMD || self.pickerMode == BRDatePickerModeYM)) {
+        NSInteger index = [monthString integerValue] - 1;
+        monthString = (index >= 0 && index < monthNames.count) ? monthNames[index] : @"";
+    }
+    if (self.addCustomString && [monthString isEqualToString:self.addCustomString]) {
+        return monthString;
+    }
+    NSString *monthUnit = self.showUnitType == BRShowUnitTypeAll ? [self getMonthUnit] : @"";
+    return [NSString stringWithFormat:@"%@%@", monthString, monthUnit];
+}
+
+- (NSString *)getDayText:(NSArray *)dayArr row:(NSInteger)row mSelectDate:(NSDate *)mSelectDate {
+    NSInteger index = 0;
+    if (row >= 0) {
+        index = MIN(row, dayArr.count - 1);
+    }
+    NSString *dayString = [dayArr objectAtIndex:index];
+    if (self.isShowToday && mSelectDate.br_year == [NSDate date].br_year && mSelectDate.br_month == [NSDate date].br_month && [dayString integerValue] == [NSDate date].br_day) {
+        return [NSBundle br_localizedStringForKey:@"今天" language:self.pickerStyle.language];
+    }
+    NSString *dayUnit = self.showUnitType == BRShowUnitTypeAll ? [self getDayUnit] : @"";
+    dayString = [NSString stringWithFormat:@"%@%@", dayString, dayUnit];
+    if (self.isShowWeek) {
+        NSDate *date = [NSDate br_setYear:mSelectDate.br_year month:mSelectDate.br_month day:[dayString integerValue]];
+        NSString *weekdayString = [NSBundle br_localizedStringForKey:[date br_weekdayString] language:self.pickerStyle.language];
+        dayString = [NSString stringWithFormat:@"%@%@", dayString, weekdayString];
+    }
+    return dayString;
+}
+
+- (NSString *)getHourText:(NSArray *)hourArr row:(NSInteger)row {
+    NSInteger index = 0;
+    if (row >= 0) {
+        index = MIN(row, hourArr.count - 1);
+    }
+    NSString *hourString = [hourArr objectAtIndex:index];
+    if (self.addCustomString && [hourString isEqualToString:self.addCustomString]) {
+        return hourString;
+    }
+    NSString *hourUnit = self.showUnitType == BRShowUnitTypeAll ? [self getHourUnit] : @"";
+    return [NSString stringWithFormat:@"%@%@", hourString, hourUnit];
+}
+
+- (NSString *)getMinuteText:(NSArray *)minuteArr row:(NSInteger)row {
+    NSInteger index = 0;
+    if (row >= 0) {
+        index = MIN(row, minuteArr.count - 1);
+    }
+    NSString *minuteString = [minuteArr objectAtIndex:index];
+    NSString *minuteUnit = self.showUnitType == BRShowUnitTypeAll ? [self getMinuteUnit] : @"";
+    return [NSString stringWithFormat:@"%@%@", minuteString, minuteUnit];
+}
+
+- (NSString *)getSecondText:(NSArray *)secondArr row:(NSInteger)row {
+    NSInteger index = 0;
+    if (row >= 0) {
+        index = MIN(row, secondArr.count - 1);
+    }
+    NSString *secondString = [secondArr objectAtIndex:index];
+    NSString *secondUnit = self.showUnitType == BRShowUnitTypeAll ? [self getSecondUnit] : @"";
+    return [NSString stringWithFormat:@"%@%@", secondString, secondUnit];
+}
+
+- (NSString *)getAMText {
+    return [NSBundle br_localizedStringForKey:@"上午" language:self.pickerStyle.language];
+}
+
+- (NSString *)getPMText {
+    return [NSBundle br_localizedStringForKey:@"下午" language:self.pickerStyle.language];
+}
+
+- (NSString *)getYearUnit {
+    if (![self.pickerStyle.language hasPrefix:@"zh"]) {
+        return @"";
+    }
+    return [NSBundle br_localizedStringForKey:@"年" language:self.pickerStyle.language];
+}
+
+- (NSString *)getMonthUnit {
+    if (![self.pickerStyle.language hasPrefix:@"zh"]) {
+        return @"";
+    }
+    return [NSBundle br_localizedStringForKey:@"月" language:self.pickerStyle.language];
+}
+
+- (NSString *)getDayUnit {
+    if (![self.pickerStyle.language hasPrefix:@"zh"]) {
+        return @"";
+    }
+    return [NSBundle br_localizedStringForKey:@"日" language:self.pickerStyle.language];
+}
+
+- (NSString *)getHourUnit {
+    if (![self.pickerStyle.language hasPrefix:@"zh"]) {
+        return @"";
+    }
+    if (self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM) {
+        return @"";
+    }
+    return [NSBundle br_localizedStringForKey:@"时" language:self.pickerStyle.language];
+}
+
+- (NSString *)getMinuteUnit {
+    if (![self.pickerStyle.language hasPrefix:@"zh"]) {
+        return @"";
+    }
+    return [NSBundle br_localizedStringForKey:@"分" language:self.pickerStyle.language];
+}
+
+- (NSString *)getSecondUnit {
+    if (![self.pickerStyle.language hasPrefix:@"zh"]) {
+        return @"";
+    }
+    return [NSBundle br_localizedStringForKey:@"秒" language:self.pickerStyle.language];
+}
+
+- (NSInteger)getIndexWithArray:(NSArray *)array object:(NSString *)obj {
+    if (!array || array.count == 0 || !obj) {
+        return 0;
+    }
+    if ([array containsObject:obj]) {
+        return [array indexOfObject:obj];
+    }
+    return 0;
+}
+
+@end

+ 223 - 0
Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView.h

@@ -0,0 +1,223 @@
+//
+//  BRDatePickerView.h
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2017/8/11.
+//  Copyright © 2017 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import "BRBaseView.h"
+#import "NSDate+BRPickerView.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// 日期选择器格式
+typedef NS_ENUM(NSInteger, BRDatePickerMode) {
+    // ----- 以下4种是系统样式(兼容国际化日期格式) -----
+    /** 【yyyy-MM-dd】UIDatePickerModeDate(美式日期:MM-dd-yyyy;英式日期:dd-MM-yyyy)*/
+    BRDatePickerModeDate,
+    /** 【yyyy-MM-dd HH:mm】 UIDatePickerModeDateAndTime */
+    BRDatePickerModeDateAndTime,
+    /** 【HH:mm】UIDatePickerModeTime */
+    BRDatePickerModeTime,
+    /** 【HH:mm】UIDatePickerModeCountDownTimer */
+    BRDatePickerModeCountDownTimer,
+    
+    // ----- 以下11种是自定义样式 -----
+    /** 【yyyy-MM-dd HH:mm:ss】年月日时分秒 */
+    BRDatePickerModeYMDHMS,
+    /** 【yyyy-MM-dd HH:mm】年月日时分 */
+    BRDatePickerModeYMDHM,
+    /** 【yyyy-MM-dd HH】年月日时 */
+    BRDatePickerModeYMDH,
+    /** 【MM-dd HH:mm】月日时分 */
+    BRDatePickerModeMDHM,
+    /** 【yyyy-MM-dd】年月日(兼容国际化日期:dd-MM-yyyy)*/
+    BRDatePickerModeYMD,
+    /** 【yyyy-MM】年月(兼容国际化日期:MM-yyyy)*/
+    BRDatePickerModeYM,
+    /** 【yyyy】年 */
+    BRDatePickerModeY,
+    /** 【MM-dd】月日 */
+    BRDatePickerModeMD,
+    /** 【HH:mm:ss】时分秒 */
+    BRDatePickerModeHMS,
+    /** 【HH:mm】时分 */
+    BRDatePickerModeHM,
+    /** 【mm:ss】分秒 */
+    BRDatePickerModeMS
+};
+
+/// 日期单位显示的位置
+typedef NS_ENUM(NSInteger, BRShowUnitType) {
+    /** 日期单位显示全部行(默认)*/
+    BRShowUnitTypeAll,
+    /** 日期单位仅显示中间行 */
+    BRShowUnitTypeOnlyCenter,
+    /** 日期单位不显示(隐藏日期单位)*/
+    BRShowUnitTypeNone
+};
+
+/// 月份名称类型
+typedef NS_ENUM(NSInteger, BRMonthNameType) {
+    /** 月份英文全称 */
+    BRMonthNameTypeFullName,
+    /** 月份英文简称 */
+    BRMonthNameTypeShortName,
+    /** 月份数字 */
+    BRMonthNameTypeNumber
+};
+
+typedef void (^BRDateResultBlock)(NSDate * _Nullable selectDate, NSString * _Nullable selectValue);
+
+@interface BRDatePickerView : BRBaseView
+
+/**
+ //////////////////////////////////////////////////////////////////////////
+ ///
+ ///   【用法一】
+ ///    特点:灵活,扩展性强(推荐使用!)
+ ///
+ ////////////////////////////////////////////////////////////////////////*/
+
+/** 日期选择器显示类型 */
+@property (nonatomic, assign) BRDatePickerMode pickerMode;
+
+/** 设置选中的时间(推荐使用 selectDate) */
+@property (nullable, nonatomic, strong) NSDate *selectDate;
+@property (nullable, nonatomic, copy) NSString *selectValue;
+
+/** 最小时间(可使用 NSDate+BRPickerView 分类中对应的方法进行创建)*/
+@property (nullable, nonatomic, strong) NSDate *minDate;
+/** 最大时间(可使用 NSDate+BRPickerView 分类中对应的方法进行创建)*/
+@property (nullable, nonatomic, strong) NSDate *maxDate;
+
+/** 选择结果的回调 */
+@property (nullable, nonatomic, copy) BRDateResultBlock resultBlock;
+
+/** 滚动选择时触发的回调 */
+@property (nullable, nonatomic, copy) BRDateResultBlock changeBlock;
+
+/** 日期单位显示类型 */
+@property (nonatomic, assign) BRShowUnitType showUnitType;
+
+/** 是否显示【星期】,默认为 NO */
+@property (nonatomic, assign, getter=isShowWeek) BOOL showWeek;
+
+/** 是否显示【今天】,默认为 NO */
+@property (nonatomic, assign, getter=isShowToday) BOOL showToday;
+
+/** 是否添加【至今】,默认为 NO */
+@property (nonatomic, assign, getter=isAddToNow) BOOL addToNow;
+
+/** 最后一行,添加【自定义字符串】;配合 selectValue 可设置默认选中 */
+@property (nullable, nonatomic, copy) NSString *addCustomString;
+
+/** 时间列表排序是否降序,默认为 NO(升序)*/
+@property (nonatomic, assign, getter=isDescending) BOOL descending;
+
+/** 选择器上数字是否带有前导零,默认为 NO(无前导零:2020-1-1;有前导零:2020-01-01)*/
+@property (nonatomic, assign, getter=isNumberFullName) BOOL numberFullName;
+
+/** 设置分的时间间隔,默认为1(范围:1 ~ 30)*/
+@property (nonatomic, assign) NSInteger minuteInterval;
+
+/** 设置秒的时间间隔,默认为1(范围:1 ~ 30)*/
+@property (nonatomic, assign) NSInteger secondInterval;
+
+/** 设置倒计时的时长,默认为0(范围:0 ~ 24*60*60-1,单位为秒) for `BRDatePickerModeCountDownTimer`, ignored otherwise. */
+@property (nonatomic, assign) NSTimeInterval countDownDuration;
+
+/** for `BRDatePickerModeYMD` or `BRDatePickerModeYM`, ignored otherwise. */
+@property (nonatomic, assign) BRMonthNameType monthNameType;
+
+/** 显示上午和下午,默认为 NO. for `BRDatePickerModeYMDH`, ignored otherwise. */
+@property (nonatomic, assign, getter=isShowAMAndPM) BOOL showAMAndPM;
+
+/** 设置时区,默认为当前时区 */
+@property (nullable, nonatomic, copy) NSTimeZone *timeZone;
+
+/** 指定不允许选择的日期 */
+@property (nullable, nonatomic, copy) NSArray <NSDate *> *nonSelectableDates;
+
+/// 初始化时间选择器
+/// @param pickerMode  日期选择器显示类型
+- (instancetype)initWithPickerMode:(BRDatePickerMode)pickerMode;
+
+/// 弹出选择器视图
+- (void)show;
+
+/// 关闭选择器视图
+- (void)dismiss;
+
+
+
+
+//================================================= 华丽的分割线 =================================================
+
+
+
+
+/**
+ //////////////////////////////////////////////////////////////////////////
+ ///
+ ///   【用法二】:快捷使用,直接选择下面其中的一个方法进行使用
+ ///    特点:快捷,方便
+ ///
+ ////////////////////////////////////////////////////////////////////////*/
+
+/**
+ *  1.显示时间选择器
+ *
+ *  @param mode             日期显示类型
+ *  @param title            选择器标题
+ *  @param selectValue      默认选中的时间(默认选中当前时间)
+ *  @param resultBlock      选择结果的回调
+ *
+ */
++ (void)showDatePickerWithMode:(BRDatePickerMode)mode
+                         title:(nullable NSString *)title
+                   selectValue:(nullable NSString *)selectValue
+                   resultBlock:(nullable BRDateResultBlock)resultBlock;
+
+/**
+ *  2.显示时间选择器
+ *
+ *  @param mode             日期显示类型
+ *  @param title            选择器标题
+ *  @param selectValue      默认选中的时间(默认选中当前时间)
+ *  @param isAutoSelect     是否自动选择,即滚动选择器后就执行结果回调,默认为 NO
+ *  @param resultBlock      选择结果的回调
+ *
+ */
++ (void)showDatePickerWithMode:(BRDatePickerMode)mode
+                         title:(nullable NSString *)title
+                   selectValue:(nullable NSString *)selectValue
+                  isAutoSelect:(BOOL)isAutoSelect
+                   resultBlock:(nullable BRDateResultBlock)resultBlock;
+
+/**
+ *  3.显示时间选择器
+ *
+ *  @param mode             日期显示类型
+ *  @param title            选择器标题
+ *  @param selectValue      默认选中的时间(默认选中当前时间)
+ *  @param minDate          最小时间(可使用 NSDate+BRPickerView 分类中对应的方法进行创建)
+ *  @param maxDate          最大时间(可使用 NSDate+BRPickerView 分类中对应的方法进行创建)
+ *  @param isAutoSelect     是否自动选择,即滚动选择器后就执行结果回调,默认为 NO
+ *  @param resultBlock      选择结果的回调
+ *
+ */
++ (void)showDatePickerWithMode:(BRDatePickerMode)mode
+                         title:(nullable NSString *)title
+                   selectValue:(nullable NSString *)selectValue
+                       minDate:(nullable NSDate *)minDate
+                       maxDate:(nullable NSDate *)maxDate
+                  isAutoSelect:(BOOL)isAutoSelect
+                   resultBlock:(nullable BRDateResultBlock)resultBlock;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1422 - 0
Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView.m


+ 97 - 0
Pods/BRPickerView/BRPickerView/DatePickerView/NSDate+BRPickerView.h

@@ -0,0 +1,97 @@
+//
+//  NSDate+BRPickerView.h
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2018/3/15.
+//  Copyright © 2018 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NSDate (BRPickerView)
+/// 获取指定date的详细信息
+@property (readonly) NSInteger br_year;    // 年
+@property (readonly) NSInteger br_month;   // 月
+@property (readonly) NSInteger br_day;     // 日
+@property (readonly) NSInteger br_hour;    // 时
+@property (readonly) NSInteger br_minute;  // 分
+@property (readonly) NSInteger br_second;  // 秒
+@property (readonly) NSInteger br_weekday; // 星期
+
+/** 获取中文星期字符串 */
+@property (nullable, nonatomic, readonly, copy) NSString *br_weekdayString;
+
+
+/// 创建 date
+/** yyyy */
++ (nullable NSDate *)br_setYear:(NSInteger)year;
+
+/** yyyy-MM */
++ (nullable NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month;
+
+/** yyyy-MM-dd */
++ (nullable NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day;
+
+/** yyyy-MM-dd HH */
++ (nullable NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour;
+
+/** yyyy-MM-dd HH:mm */
++ (nullable NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute;
+
+/** yyyy-MM-dd HH:mm:ss */
++ (nullable NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second;
+
+/** MM-dd HH:mm */
++ (nullable NSDate *)br_setMonth:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute;
+
+/** MM-dd */
++ (nullable NSDate *)br_setMonth:(NSInteger)month day:(NSInteger)day;
+
+/** HH:mm:ss */
++ (nullable NSDate *)br_setHour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second;
+
+/** HH:mm */
++ (nullable NSDate *)br_setHour:(NSInteger)hour minute:(NSInteger)minute;
+
+/** mm:ss */
++ (nullable NSDate *)br_setMinute:(NSInteger)minute second:(NSInteger)second;
+
+
+/** 获取某个月的天数(通过年月求每月天数)*/
++ (NSUInteger)br_getDaysInYear:(NSInteger)year month:(NSInteger)month;
+
+/**  获取 日期加上/减去某天数后的新日期 */
+- (nullable NSDate *)br_getNewDate:(NSDate *)date addDays:(NSTimeInterval)days;
+
+
+/** NSDate 转 NSString */
++ (nullable NSString *)br_stringFromDate:(NSDate *)date dateFormat:(NSString *)dateFormat;
+/** NSDate 转 NSString */
++ (nullable NSString *)br_stringFromDate:(NSDate *)date
+                     dateFormat:(NSString *)dateFormat
+                       timeZone:(nullable NSTimeZone *)timeZone
+                       language:(nullable NSString *)language;
+
+
+/** NSString 转 NSDate */
++ (nullable NSDate *)br_dateFromString:(NSString *)dateString dateFormat:(NSString *)dateFormat;
+/** NSString 转 NSDate */
++ (nullable NSDate *)br_dateFromString:(NSString *)dateString
+                   dateFormat:(NSString *)dateFormat
+                     timeZone:(nullable NSTimeZone *)timeZone
+                     language:(nullable NSString *)language;
+
+
+/** NSDate 转 NSString(已弃用) */
++ (nullable NSString *)br_getDateString:(NSDate *)date format:(NSString *)format DEPRECATED_MSG_ATTRIBUTE("Use 'br_stringFromDate:dateFormat:' instead");
+
+/** NSString 转 NSDate(已弃用) */
++ (nullable NSDate *)br_getDate:(NSString *)dateString format:(NSString *)format DEPRECATED_MSG_ATTRIBUTE("Use 'br_dateFromString:dateFormat:' instead");
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 304 - 0
Pods/BRPickerView/BRPickerView/DatePickerView/NSDate+BRPickerView.m

@@ -0,0 +1,304 @@
+//
+//  NSDate+BRPickerView.m
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2018/3/15.
+//  Copyright © 2018 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import "NSDate+BRPickerView.h"
+#import "BRPickerViewMacro.h"
+
+BRSYNTH_DUMMY_CLASS(NSDate_BRPickerView)
+
+static const NSCalendarUnit unitFlags = (NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekOfMonth |  NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal);
+
+@implementation NSDate (BRPickerView)
+
+#pragma mark - 获取日历单例对象
++ (NSCalendar *)calendar {
+    static NSCalendar *sharedCalendar = nil;
+    if (!sharedCalendar) {
+        // 创建日历对象,指定日历的算法(公历)
+        sharedCalendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
+    }
+    return sharedCalendar;
+}
+
+#pragma mark - 获取指定日期的年份
+- (NSInteger)br_year {
+    // NSDateComponent 可以获得日期的详细信息,即日期的组成
+    NSDateComponents *components = [[NSDate calendar] components:unitFlags fromDate:self];
+    return components.year;
+}
+
+#pragma mark - 获取指定日期的月份
+- (NSInteger)br_month {
+    NSDateComponents *components = [[NSDate calendar] components:unitFlags fromDate:self];
+    return components.month;
+}
+
+#pragma mark - 获取指定日期的天
+- (NSInteger)br_day {
+    NSDateComponents *components = [[NSDate calendar] components:unitFlags fromDate:self];
+    return components.day;
+}
+
+#pragma mark - 获取指定日期的小时
+- (NSInteger)br_hour {
+    NSDateComponents *components = [[NSDate calendar] components:unitFlags fromDate:self];
+    return components.hour;
+}
+
+#pragma mark - 获取指定日期的分钟
+- (NSInteger)br_minute {
+    NSDateComponents *comps = [[NSDate calendar] components:unitFlags fromDate:self];
+    return comps.minute;
+}
+
+#pragma mark - 获取指定日期的秒
+- (NSInteger)br_second {
+    NSDateComponents *components = [[NSDate calendar] components:unitFlags fromDate:self];
+    return components.second;
+}
+
+#pragma mark - 获取指定日期的星期
+- (NSInteger)br_weekday {
+    NSDateComponents *components = [[NSDate calendar] components:unitFlags fromDate:self];
+    return components.weekday;
+}
+
+#pragma mark - 获取指定日期的星期
+- (NSString *)br_weekdayString {
+    switch (self.br_weekday - 1) {
+        case 0:
+        {
+            return @"周日";
+        }
+            break;
+        case 1:
+        {
+            return @"周一";
+        }
+            break;
+        case 2:
+        {
+            return @"周二";
+        }
+            break;
+        case 3:
+        {
+            return @"周三";
+        }
+            break;
+        case 4:
+        {
+            return @"周四";
+        }
+            break;
+        case 5:
+        {
+            return @"周五";
+        }
+            break;
+        case 6:
+        {
+            return @"周六";
+        }
+            break;
+            
+        default:
+            break;
+    }
+    
+    return @"";
+}
+
+#pragma mark - 创建date(通过 NSCalendar 类来创建日期)
++ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second {
+    NSCalendar *calendar = [self calendar];
+    // 获取当前日期组件
+    NSDateComponents *components = [calendar components:unitFlags fromDate:[NSDate date]];
+    if (year > 0) {
+        // 初始化日期组件
+        components = [[NSDateComponents alloc]init];
+        components.year = year;
+    }
+    if (month > 0) {
+        components.month = month;
+    }
+    if (day > 0) {
+        components.day = day;
+    }
+    if (hour >= 0) {
+        components.hour = hour;
+    }
+    if (minute >= 0) {
+        components.minute = minute;
+    }
+    if (second >= 0) {
+        components.second = second;
+    }
+    
+    NSDate *date = [calendar dateFromComponents:components];
+    
+    return date;
+}
+
++ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute {
+    return [self br_setYear:year month:month day:day hour:hour minute:minute second:0];
+}
+
++ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour {
+    return [self br_setYear:year month:month day:day hour:hour minute:0 second:0];
+}
+
++ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day {
+    return [self br_setYear:year month:month day:day hour:0 minute:0 second:0];
+}
+
++ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month {
+    return [self br_setYear:year month:month day:0 hour:0 minute:0 second:0];
+}
+
++ (NSDate *)br_setYear:(NSInteger)year {
+    return [self br_setYear:year month:0 day:0 hour:0 minute:0 second:0];
+}
+
++ (NSDate *)br_setMonth:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute {
+    return [self br_setYear:0 month:month day:day hour:hour minute:minute second:0];
+}
+
++ (NSDate *)br_setMonth:(NSInteger)month day:(NSInteger)day {
+    return [self br_setYear:0 month:month day:day hour:0 minute:0 second:0];
+}
+
++ (NSDate *)br_setHour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second {
+    return [self br_setYear:0 month:0 day:0 hour:hour minute:minute second:second];
+}
+
++ (NSDate *)br_setHour:(NSInteger)hour minute:(NSInteger)minute {
+    return [self br_setYear:0 month:0 day:0 hour:hour minute:minute second:0];
+}
+
++ (NSDate *)br_setMinute:(NSInteger)minute second:(NSInteger)second {
+    return [self br_setYear:0 month:0 day:0 hour:0 minute:minute second:second];
+}
+
+#pragma mark - 获取某个月的天数(通过年月求每月天数)
++ (NSUInteger)br_getDaysInYear:(NSInteger)year month:(NSInteger)month {
+    BOOL isLeapYear = year % 4 == 0 ? (year % 100 == 0 ? (year % 400 == 0 ? YES : NO) : YES) : NO;
+    switch (month) {
+        case 1:
+        case 3:
+        case 5:
+        case 7:
+        case 8:
+        case 10:
+        case 12:
+        {
+            return 31;
+        }
+        case 4:
+        case 6:
+        case 9:
+        case 11:
+        {
+            return 30;
+        }
+        case 2:
+        {
+            if (isLeapYear) {
+                return 29;
+            } else {
+                return 28;
+            }
+        }
+        default:
+            break;
+    }
+    
+    return 0;
+}
+
+#pragma mark - 获取 日期加上/减去某天数后的新日期
+- (NSDate *)br_getNewDate:(NSDate *)date addDays:(NSTimeInterval)days {
+    // days 为正数时,表示几天之后的日期;负数表示几天之前的日期
+    return [self dateByAddingTimeInterval:60 * 60 * 24 * days];
+}
+
+#pragma mark - NSDate 转 NSString
++ (NSString *)br_stringFromDate:(NSDate *)date dateFormat:(NSString *)dateFormat {
+    return [self br_stringFromDate:date dateFormat:dateFormat timeZone:nil language:nil];
+}
+#pragma mark - NSDate 转 NSString
++ (NSString *)br_stringFromDate:(NSDate *)date
+                     dateFormat:(NSString *)dateFormat
+                       timeZone:(NSTimeZone *)timeZone
+                       language:(NSString *)language {
+    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
+    // 设置日期格式
+    dateFormatter.dateFormat = dateFormat;
+    // 设置时区,不设置默认为系统时区
+    if (timeZone) {
+        dateFormatter.timeZone = timeZone;
+    }
+    if (!language) {
+        language = [NSLocale preferredLanguages].firstObject;
+    }
+    dateFormatter.locale = [[NSLocale alloc]initWithLocaleIdentifier:language];
+    NSString *dateString = [dateFormatter stringFromDate:date];
+
+    return dateString;
+}
+
+#pragma mark - NSString 转 NSDate
++ (NSDate *)br_dateFromString:(NSString *)dateString dateFormat:(NSString *)dateFormat {
+    return [self br_dateFromString:dateString dateFormat:dateFormat timeZone:nil language:nil];
+}
+#pragma mark - NSString 转 NSDate
++ (NSDate *)br_dateFromString:(NSString *)dateString
+                   dateFormat:(NSString *)dateFormat
+                     timeZone:(NSTimeZone *)timeZone
+                     language:(NSString *)language {
+    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
+    // 设置日期格式
+    dateFormatter.dateFormat = dateFormat;
+    // 设置时区
+    if (!timeZone) {
+        timeZone = [self currentTimeZone];
+    }
+    if (!language) {
+        language = [NSLocale preferredLanguages].firstObject;
+    }
+    dateFormatter.timeZone = timeZone;
+    dateFormatter.locale = [[NSLocale alloc]initWithLocaleIdentifier:language];
+    // 如果当前时间不存在,就获取距离最近的整点时间
+    dateFormatter.lenient = YES;
+    
+    return [dateFormatter dateFromString:dateString];
+}
+
+#pragma mark - 获取当前时区(不使用夏时制)
++ (NSTimeZone *)currentTimeZone {
+    // 当前时区
+    NSTimeZone *localTimeZone = [NSTimeZone localTimeZone];
+    // 当前时区相对于GMT(零时区)的偏移秒数
+    NSInteger interval = [localTimeZone secondsFromGMTForDate:[NSDate date]];
+    // 当前时区(不使用夏时制):由偏移量获得对应的NSTimeZone对象
+    // 注意:一些夏令时时间 NSString 转 NSDate 时,默认会导致 NSDateFormatter 格式化失败,返回 null
+    return [NSTimeZone timeZoneForSecondsFromGMT:interval];
+}
+
+#pragma mark - NSDate 转 NSString(已弃用)
++ (NSString *)br_getDateString:(NSDate *)date format:(NSString *)format {
+    return [self br_stringFromDate:date dateFormat:format];
+}
+
+#pragma mark - NSString 转 NSDate(已弃用)
++ (NSDate *)br_getDate:(NSString *)dateString format:(NSString *)format {
+    return [self br_dateFromString:dateString dateFormat:format];
+}
+
+@end

+ 40 - 0
Pods/BRPickerView/BRPickerView/StringPickerView/BRResultModel.h

@@ -0,0 +1,40 @@
+//
+//  BRResultModel.h
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2019/10/2.
+//  Copyright © 2019 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface BRResultModel : NSObject
+
+/** 索引 */
+@property (nonatomic, assign) NSInteger index;
+/** key */
+@property (nullable, nonatomic, copy) NSString *key;
+/** value */
+@property (nullable, nonatomic, copy) NSString *value;
+
+/** 父级key(提示:联动时第一级数据,parentKey设置为:@"-1") */
+@property (nullable, nonatomic, copy) NSString *parentKey;
+/** 父级value */
+@property (nullable, nonatomic, copy) NSString *parentValue;
+
+
+/// 其它扩展字段
+@property (nullable, nonatomic, copy) NSString *remark;
+@property (nonatomic, assign) BOOL boolField;
+@property (nullable, nonatomic, strong) id idField;
+@property (nullable, nonatomic, strong) NSNumber *numberField;
+
+@property (nullable, nonatomic, copy) NSString *ID __attribute__((deprecated("Use 'key' instead")));
+@property (nullable, nonatomic, copy) NSString *name __attribute__((deprecated("Use 'value' instead")));
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 49 - 0
Pods/BRPickerView/BRPickerView/StringPickerView/BRResultModel.m

@@ -0,0 +1,49 @@
+//
+//  BRResultModel.m
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2019/10/2.
+//  Copyright © 2019 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import "BRResultModel.h"
+
+@implementation BRResultModel
+
+/// 判断两个对象是否相等
+/// @param object 目标对象
+- (BOOL)isEqual:(id)object {
+    // 1.对象的地址相同
+    if (self == object) {
+        return YES;
+    }
+    
+    if (![object isKindOfClass:[BRResultModel class]]) {
+        return NO;
+    }
+    
+    BRResultModel *model = (BRResultModel *)object;
+    if (!model) {
+        return NO;
+    }
+    // 2.对象的类型相同,且对象的各个属性相等
+    BOOL isSameKey = (!self.key && !model.key) || [self.key isEqualToString:model.key];
+    BOOL isSameValue = (!self.value && !model.value) || [self.value isEqualToString:model.value];
+    
+    return isSameKey && isSameValue;
+}
+
+- (NSUInteger)hash {
+    return [self.key hash] ^ [self.value hash];
+}
+
+- (NSString *)ID {
+    return _key;
+}
+
+- (NSString *)name {
+    return _value;
+}
+
+@end

+ 191 - 0
Pods/BRPickerView/BRPickerView/StringPickerView/BRStringPickerView.h

@@ -0,0 +1,191 @@
+//
+//  BRStringPickerView.h
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2017/8/11.
+//  Copyright © 2017 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import "BRBaseView.h"
+#import "BRResultModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// 字符串选择器类型
+typedef NS_ENUM(NSInteger, BRStringPickerMode) {
+    /** 单列选择器 */
+    BRStringPickerComponentSingle,
+    /** 多列选择器 */
+    BRStringPickerComponentMulti,
+    /** 多级联动选择器 */
+    BRStringPickerComponentLinkage
+};
+
+typedef void(^BRStringResultModelBlock)(BRResultModel * _Nullable resultModel);
+
+typedef void(^BRStringResultModelArrayBlock)(NSArray <BRResultModel *> * _Nullable resultModelArr);
+
+@interface BRStringPickerView : BRBaseView
+
+/**
+ //////////////////////////////////////////////////////////////////////////
+ ///
+ ///   【用法一】
+ ///    特点:灵活,扩展性强(推荐使用!)
+ ///
+ ////////////////////////////////////////////////////////////////////////*/
+
+/** 字符串选择器显示类型 */
+@property (nonatomic, assign) BRStringPickerMode pickerMode;
+
+/**
+ *  1.设置数据源
+ *    单列:@[@"男", @"女", @"其他"],或直接传一维模型数组(NSArray <BRResultModel *>*)
+ *    多列:@[@[@"语文", @"数学", @"英语"], @[@"优秀", @"良好"]],或直接传多维模型数组
+ *    联动:直接传一维模型数组(NSArray <BRResultModel *>*),要注意数据源联动格式,可参考Demo
+ */
+@property (nullable, nonatomic, copy) NSArray *dataSourceArr;
+/**
+ *  2.设置数据源
+ *    直接传plist文件名:NSString类型(如:@"test.plist"),要带后缀名
+ *    场景:可以将数据源数据(数组类型)放到plist文件中,直接传plist文件名更加简单
+ */
+@property (nullable, nonatomic, copy) NSString *plistName;
+
+/**
+ *  设置默认选中的位置【单列】
+ *  推荐使用 selectIndex,更加严谨,可以避免使用 selectValue 时,有名称相同的情况
+ */
+@property (nonatomic, assign) NSInteger selectIndex;
+@property (nullable, nonatomic, copy) NSString *selectValue;
+
+/**
+ *  设置默认选中的位置【多列】
+ *  推荐使用 selectIndexs,更加严谨,可以避免使用 selectValues 时,有名称相同的情况
+ */
+@property (nullable, nonatomic, copy) NSArray <NSNumber *> *selectIndexs;
+@property (nullable, nonatomic, copy) NSArray <NSString *> *selectValues;
+
+/** 选择结果的回调【单列】 */
+@property (nullable, nonatomic, copy) BRStringResultModelBlock resultModelBlock;
+/** 选择结果的回调【多列】 */
+@property (nullable, nonatomic, copy) BRStringResultModelArrayBlock resultModelArrayBlock;
+
+/** 滚动选择时触发的回调【单列】 */
+@property (nullable, nonatomic, copy) BRStringResultModelBlock changeModelBlock;
+/** 滚动选择时触发的回调【多列】 */
+@property (nullable, nonatomic, copy) BRStringResultModelArrayBlock changeModelArrayBlock;
+
+/**
+ *  最大层级数(列数) for `BRStringPickerComponentLinkage`, ignored otherwise.
+ *  使用场景:默认可选,当数据源中有 key 等于 parentKey 情况时,必须要设置
+ */
+@property (nonatomic, assign) NSInteger numberOfComponents;
+
+/// 初始化字符串选择器
+/// @param pickerMode 字符串选择器显示类型
+- (instancetype)initWithPickerMode:(BRStringPickerMode)pickerMode;
+
+/// 弹出选择器视图
+- (void)show;
+
+/// 关闭选择器视图
+- (void)dismiss;
+
+
+
+
+//================================================= 华丽的分割线 =================================================
+
+
+
+
+/**
+ //////////////////////////////////////////////////////////////////////////
+ ///
+ ///   【用法二】:快捷使用,直接选择下面其中的一个方法进行使用
+ ///    特点:快捷,方便
+ ///
+ ////////////////////////////////////////////////////////////////////////*/
+
+/**
+ *  1.显示【单列】选择器
+ *
+ *  @param title               选择器标题
+ *  @param dataSourceArr       数据源,格式:@[@"男", @"女", @"其他"],或直接传一维模型数组(NSArray <BRResultModel *>*)
+ *  @param selectIndex         默认选中的位置
+ *  @param resultBlock         选择后的回调
+ *
+ */
++ (void)showPickerWithTitle:(nullable NSString *)title
+              dataSourceArr:(nullable NSArray *)dataSourceArr
+                selectIndex:(NSInteger)selectIndex
+                resultBlock:(nullable BRStringResultModelBlock)resultBlock;
+
+/**
+ *  2.显示【单列】选择器
+ *
+ *  @param title               选择器标题
+ *  @param dataSourceArr       数据源(如:@[@"男", @"女", @"其他"],或直接传模型数组)
+ *  @param selectIndex         默认选中的位置
+ *  @param isAutoSelect        是否自动选择,即滚动选择器后就执行结果回调,默认为 NO
+ *  @param resultBlock         选择后的回调
+ *
+ */
++ (void)showPickerWithTitle:(nullable NSString *)title
+              dataSourceArr:(nullable NSArray *)dataSourceArr
+                selectIndex:(NSInteger)selectIndex
+               isAutoSelect:(BOOL)isAutoSelect
+                resultBlock:(nullable BRStringResultModelBlock)resultBlock;
+
+/**
+ *  3.显示【多列】选择器
+ *
+ *  @param title               选择器标题
+ *  @param dataSourceArr       数据源,格式:@[@[@"语文", @"数学", @"英语"], @[@"优秀", @"良好"]],或直接传多维模型数组
+ *  @param selectIndexs        默认选中的位置(传索引数组,如:@[@2, @1])
+ *  @param resultBlock         选择后的回调
+ *
+ */
++ (void)showMultiPickerWithTitle:(nullable NSString *)title
+                   dataSourceArr:(nullable NSArray *)dataSourceArr
+                    selectIndexs:(nullable NSArray <NSNumber *> *)selectIndexs
+                     resultBlock:(nullable BRStringResultModelArrayBlock)resultBlock;
+
+/**
+ *  4.显示【多列】选择器
+ *
+ *  @param title               选择器标题
+ *  @param dataSourceArr       数据源,格式:@[@[@"语文", @"数学", @"英语"], @[@"优秀", @"良好"]],或直接传多维模型数组
+ *  @param selectIndexs        默认选中的位置(传索引数组,如:@[@2, @1])
+ *  @param isAutoSelect        是否自动选择,即滚动选择器后就执行结果回调,默认为 NO
+ *  @param resultBlock         选择后的回调
+ *
+ */
++ (void)showMultiPickerWithTitle:(nullable NSString *)title
+                   dataSourceArr:(nullable NSArray *)dataSourceArr
+                    selectIndexs:(nullable NSArray <NSNumber *> *)selectIndexs
+                    isAutoSelect:(BOOL)isAutoSelect
+                     resultBlock:(nullable BRStringResultModelArrayBlock)resultBlock;
+
+/**
+ *  5.显示【联动】选择器
+ *
+ *  @param title               选择器标题
+ *  @param dataSourceArr       数据源,格式:直接传一维模型数组(NSArray <BRResultModel *>*)
+ *  @param selectIndexs        默认选中的位置(传索引数组,如:@[@2, @1])
+ *  @param isAutoSelect        是否自动选择,即滚动选择器后就执行结果回调,默认为 NO
+ *  @param resultBlock         选择后的回调
+ *
+ */
++ (void)showLinkagePickerWithTitle:(nullable NSString *)title
+                     dataSourceArr:(nullable NSArray *)dataSourceArr
+                      selectIndexs:(nullable NSArray <NSNumber *> *)selectIndexs
+                      isAutoSelect:(BOOL)isAutoSelect
+                       resultBlock:(nullable BRStringResultModelArrayBlock)resultBlock;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 621 - 0
Pods/BRPickerView/BRPickerView/StringPickerView/BRStringPickerView.m

@@ -0,0 +1,621 @@
+//
+//  BRStringPickerView.m
+//  BRPickerViewDemo
+//
+//  Created by renbo on 2017/8/11.
+//  Copyright © 2017 irenb. All rights reserved.
+//
+//  最新代码下载地址:https://github.com/91renb/BRPickerView
+
+#import "BRStringPickerView.h"
+
+@interface BRStringPickerView ()<UIPickerViewDelegate, UIPickerViewDataSource>
+{
+    BOOL _dataSourceException; // 数据源格式是否有误
+}
+/** 选择器 */
+@property (nonatomic, strong) UIPickerView *pickerView;
+/** 单列选择的值 */
+@property (nonatomic, copy) NSString *mSelectValue;
+/** 多列选择的值 */
+@property (nonatomic, copy) NSArray <NSString *>* mSelectValues;
+
+/** 数据源 */
+@property (nullable, nonatomic, copy) NSArray *mDataSourceArr;
+
+@end
+
+@implementation BRStringPickerView
+
+#pragma mark - 1.显示【单列】选择器
++ (void)showPickerWithTitle:(NSString *)title
+              dataSourceArr:(NSArray *)dataSourceArr
+                selectIndex:(NSInteger)selectIndex
+                resultBlock:(BRStringResultModelBlock)resultBlock {
+    [self showPickerWithTitle:title dataSourceArr:dataSourceArr selectIndex:selectIndex isAutoSelect:NO resultBlock:resultBlock];
+}
+
+#pragma mark - 2.显示【单列】选择器
++ (void)showPickerWithTitle:(NSString *)title
+              dataSourceArr:(NSArray *)dataSourceArr
+                selectIndex:(NSInteger)selectIndex
+               isAutoSelect:(BOOL)isAutoSelect
+                resultBlock:(BRStringResultModelBlock)resultBlock {
+    // 创建选择器
+    BRStringPickerView *strPickerView = [[BRStringPickerView alloc]init];
+    strPickerView.pickerMode = BRStringPickerComponentSingle;
+    strPickerView.title = title;
+    strPickerView.dataSourceArr = dataSourceArr;
+    strPickerView.selectIndex = selectIndex;
+    strPickerView.isAutoSelect = isAutoSelect;
+    strPickerView.resultModelBlock = resultBlock;
+    
+    // 显示
+    [strPickerView show];
+}
+
+#pragma mark - 3.显示【多列】选择器
++ (void)showMultiPickerWithTitle:(NSString *)title
+                   dataSourceArr:(NSArray *)dataSourceArr
+                    selectIndexs:(NSArray <NSNumber *>*)selectIndexs
+                     resultBlock:(BRStringResultModelArrayBlock)resultBlock {
+    [self showMultiPickerWithTitle:title dataSourceArr:dataSourceArr selectIndexs:selectIndexs isAutoSelect:NO resultBlock:resultBlock];
+}
+
+#pragma mark - 4.显示【多列】选择器
++ (void)showMultiPickerWithTitle:(NSString *)title
+                   dataSourceArr:(NSArray *)dataSourceArr
+                    selectIndexs:(NSArray <NSNumber *>*)selectIndexs
+                    isAutoSelect:(BOOL)isAutoSelect
+                     resultBlock:(BRStringResultModelArrayBlock)resultBlock {
+    // 创建选择器
+    BRStringPickerView *strPickerView = [[BRStringPickerView alloc]init];
+    strPickerView.pickerMode = BRStringPickerComponentMulti;
+    strPickerView.title = title;
+    strPickerView.dataSourceArr = dataSourceArr;
+    strPickerView.selectIndexs = selectIndexs;
+    strPickerView.isAutoSelect = isAutoSelect;
+    strPickerView.resultModelArrayBlock = resultBlock;
+    
+    // 显示
+    [strPickerView show];
+}
+
+#pragma mark - 5.显示【联动】选择器
++ (void)showLinkagePickerWithTitle:(nullable NSString *)title
+                     dataSourceArr:(nullable NSArray *)dataSourceArr
+                      selectIndexs:(nullable NSArray <NSNumber *> *)selectIndexs
+                      isAutoSelect:(BOOL)isAutoSelect
+                       resultBlock:(nullable BRStringResultModelArrayBlock)resultBlock {
+    // 创建选择器
+    BRStringPickerView *strPickerView = [[BRStringPickerView alloc]init];
+    strPickerView.pickerMode = BRStringPickerComponentLinkage;
+    strPickerView.title = title;
+    strPickerView.dataSourceArr = dataSourceArr;
+    strPickerView.selectIndexs = selectIndexs;
+    strPickerView.isAutoSelect = isAutoSelect;
+    strPickerView.resultModelArrayBlock = resultBlock;
+    
+    // 显示
+    [strPickerView show];
+}
+
+#pragma mark - 初始化自定义选择器
+- (instancetype)initWithPickerMode:(BRStringPickerMode)pickerMode {
+    if (self = [super init]) {
+        self.pickerMode = pickerMode;
+    }
+    return self;
+}
+
+#pragma mark - 处理选择器数据
+- (void)handlerPickerData {
+    if (self.dataSourceArr.count == 0) {
+        _dataSourceException = YES;
+    }
+    id item = [self.dataSourceArr firstObject];
+    if (self.pickerMode == BRStringPickerComponentSingle) {
+        _dataSourceException = [item isKindOfClass:[NSArray class]];
+    } else if (self.pickerMode == BRStringPickerComponentMulti) {
+        _dataSourceException = [item isKindOfClass:[NSString class]];
+    } else if (self.pickerMode == BRStringPickerComponentLinkage) {
+        _dataSourceException = ![item isKindOfClass:[BRResultModel class]];
+    }
+    if (_dataSourceException) {
+        NSAssert(!_dataSourceException, @"数据源异常!请检查选择器数据源的格式");
+        return;
+    }
+    
+    // 处理选择器当前选择的值
+    if (self.pickerMode == BRStringPickerComponentSingle) {
+        self.mDataSourceArr = self.dataSourceArr;
+        NSInteger selectIndex = 0;
+        if (self.selectIndex > 0 && self.selectIndex < self.mDataSourceArr.count) {
+            selectIndex = self.selectIndex;
+        } else {
+            if (self.mSelectValue) {
+                id item = [self.mDataSourceArr firstObject];
+                if ([item isKindOfClass:[BRResultModel class]]) {
+                    for (NSInteger i = 0; i < self.mDataSourceArr.count; i++) {
+                        BRResultModel *model = self.mDataSourceArr[i];
+                        if ([model.value isEqualToString:self.mSelectValue]) {
+                            selectIndex = i;
+                            break;
+                        }
+                    }
+                } else {
+                    if ([self.mDataSourceArr containsObject:self.mSelectValue]) {
+                        selectIndex = [self.mDataSourceArr indexOfObject:self.mSelectValue];
+                    }
+                }
+            }
+        }
+        self.selectIndex = selectIndex;
+        
+    } else if (self.pickerMode == BRStringPickerComponentMulti) {
+        self.mDataSourceArr = self.dataSourceArr;
+        NSMutableArray *selectIndexs = [[NSMutableArray alloc]init];
+        for (NSInteger i = 0; i < self.mDataSourceArr.count; i++) {
+            NSInteger row = 0;
+            if (self.selectIndexs.count > 0) {
+                if (i < self.selectIndexs.count) {
+                    NSInteger index = [self.selectIndexs[i] integerValue];
+                    row = ((index > 0 && index < [self.mDataSourceArr[i] count]) ? index : 0);
+                }
+            } else {
+                if (self.mSelectValues.count > 0 && i < self.mSelectValues.count) {
+                    NSString *value = self.mSelectValues[i];
+                    NSArray *itemArr = self.mDataSourceArr[i];
+                    id item = [itemArr firstObject];
+                    if ([item isKindOfClass:[BRResultModel class]]) {
+                        for (NSInteger j = 0; j < itemArr.count; j++) {
+                            BRResultModel *model = itemArr[j];
+                            if ([model.value isEqualToString:value]) {
+                                row = j;
+                                break;
+                            }
+                        }
+                    } else {
+                        if ([self.mDataSourceArr[i] containsObject:value]) {
+                            row = [self.mDataSourceArr[i] indexOfObject:value];
+                        }
+                    }
+                }
+            }
+            [selectIndexs addObject:@(row)];
+        }
+        self.selectIndexs = [selectIndexs copy];
+        
+    } else if (self.pickerMode == BRStringPickerComponentLinkage) {
+        
+        NSMutableArray *selectIndexs = [[NSMutableArray alloc]init];
+        NSMutableArray *mDataSourceArr = [[NSMutableArray alloc]init];
+        
+        BRResultModel *selectModel = nil;
+        BOOL hasNext = YES;
+        NSInteger i = 0;
+
+        NSMutableArray *dataArr = [self.dataSourceArr mutableCopy];
+        
+        do {
+            NSArray *nextArr = [self getNextDataArr:dataArr selectModel:selectModel];
+            // 设置 numberOfComponents,防止 key 等于 parentKey 时进入死循环
+            if (nextArr.count == 0 || i > self.numberOfComponents - 1) {
+                hasNext = NO;
+                break;
+            }
+            
+            NSInteger selectIndex = 0;
+            if (self.selectIndexs.count > i && [self.selectIndexs[i] integerValue] < nextArr.count) {
+                selectIndex = [self.selectIndexs[i] integerValue];
+            }
+            selectModel = nextArr[selectIndex];
+            
+            [selectIndexs addObject:@(selectIndex)];
+            [mDataSourceArr addObject:nextArr];
+
+            i++;
+            
+        } while (hasNext);
+        
+        self.selectIndexs = [selectIndexs copy];
+        self.mDataSourceArr = [mDataSourceArr copy];
+    }
+}
+
+- (NSArray <BRResultModel *>*)getNextDataArr:(NSArray *)dataArr selectModel:(BRResultModel *)selectModel {
+    NSMutableArray *tempArr = [[NSMutableArray alloc]init];
+    // parentKey = @"-1",表示是第一列数据
+    NSString *key = selectModel ? selectModel.key : @"-1";
+    for (BRResultModel *model in dataArr) {
+        if ([model.parentKey isEqualToString:key]) {
+            [tempArr addObject:model];
+        }
+    }
+    return [tempArr copy];
+}
+
+#pragma mark - 选择器
+- (UIPickerView *)pickerView {
+    if (!_pickerView) {
+        CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
+        _pickerView = [[UIPickerView alloc]initWithFrame:CGRectMake(0, self.pickerStyle.titleBarHeight + pickerHeaderViewHeight, self.keyView.bounds.size.width, self.pickerStyle.pickerHeight)];
+        _pickerView.backgroundColor = self.pickerStyle.pickerColor;
+        _pickerView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
+        _pickerView.dataSource = self;
+        _pickerView.delegate = self;
+    }
+    return _pickerView;
+}
+
+#pragma mark - UIPickerViewDataSource
+// 1.设置 pickerView 的列数
+- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
+    switch (self.pickerMode) {
+        case BRStringPickerComponentSingle:
+            return 1;
+            break;
+        case BRStringPickerComponentMulti:
+        case BRStringPickerComponentLinkage:
+            return self.mDataSourceArr.count;
+            break;
+            
+        default:
+            break;
+    }
+}
+
+// 2.设置 pickerView 每列的行数
+- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
+    switch (self.pickerMode) {
+        case BRStringPickerComponentSingle:
+            return self.mDataSourceArr.count;
+            break;
+        case BRStringPickerComponentMulti:
+        case BRStringPickerComponentLinkage:
+            return [self.mDataSourceArr[component] count];
+            break;
+            
+        default:
+            break;
+    }
+}
+
+#pragma mark - UIPickerViewDelegate
+// 3.设置 pickerView 的显示内容
+- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view {
+    // 1.自定义 row 的内容视图
+    UILabel *label = (UILabel *)view;
+    if (!label) {
+        label = [[UILabel alloc]init];
+        label.backgroundColor = [UIColor clearColor];
+        label.textAlignment = NSTextAlignmentCenter;
+        label.textColor = self.pickerStyle.pickerTextColor;
+        label.font = self.pickerStyle.pickerTextFont;
+        // 字体自适应属性
+        label.adjustsFontSizeToFitWidth = YES;
+        // 自适应最小字体缩放比例
+        label.minimumScaleFactor = 0.5f;
+    }
+    if (self.pickerMode == BRStringPickerComponentSingle) {
+        label.frame = CGRectMake(0, 0, self.pickerView.frame.size.width, self.pickerStyle.rowHeight);
+        id item = self.mDataSourceArr[row];
+        if ([item isKindOfClass:[BRResultModel class]]) {
+            BRResultModel *model = (BRResultModel *)item;
+            label.text = model.value;
+        } else {
+            label.text = item;
+        }
+    } else if (self.pickerMode == BRStringPickerComponentMulti || self.pickerMode == BRStringPickerComponentLinkage) {
+        label.frame = CGRectMake(0, 0, self.pickerView.frame.size.width / pickerView.numberOfComponents, self.pickerStyle.rowHeight);
+        id item = self.mDataSourceArr[component][row];
+        if ([item isKindOfClass:[BRResultModel class]]) {
+            BRResultModel *model = (BRResultModel *)item;
+            label.text = model.value;
+        } else {
+            label.text = item;
+        }
+    }
+    
+    // 2.设置选择器中间选中行的样式
+    [self setPickerSelectRowStyle:pickerView titleForRow:row forComponent:component];
+    
+    return label;
+}
+
+#pragma mark - 设置选择器中间选中行的样式
+- (void)setPickerSelectRowStyle:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
+    // 1.设置分割线的颜色
+    for (UIView *subView in pickerView.subviews) {
+        if (subView && [subView isKindOfClass:[UIView class]] && subView.frame.size.height <= 1) {
+            subView.backgroundColor = self.pickerStyle.separatorColor;
+        }
+    }
+    
+    // 2.设置选择器中间选中行的背景颜色
+    if (self.pickerStyle.selectRowColor) {
+        UIView *contentView = nil;
+        NSArray *subviews = pickerView.subviews;
+        if (subviews.count > 0) {
+            id obj = subviews.firstObject;
+            if (obj && [obj isKindOfClass:[UIView class]]) {
+                contentView = (UIView *)obj;
+            }
+        }
+        UIView *columnView = nil;
+        if (contentView) {
+            id obj = [contentView valueForKey:@"subviewCache"];
+            if (obj && [obj isKindOfClass:[NSArray class]]) {
+                NSArray *columnViews = (NSArray *)obj;
+                if (columnViews.count > 0) {
+                    id columnObj = columnViews.firstObject;
+                    if (columnObj && [columnObj isKindOfClass:[UIView class]]) {
+                        columnView = (UIView *)columnObj;
+                    }
+                }
+            }
+        }
+        if (columnView) {
+            id obj = [columnView valueForKey:@"middleContainerView"];
+            if (obj && [obj isKindOfClass:[UIView class]]) {
+                UIView *selectRowView = (UIView *)obj;
+                selectRowView.backgroundColor = self.pickerStyle.selectRowColor;
+            }
+        }
+    }
+    
+    // 3.设置选择器中间选中行的字体颜色/字体大小
+    if (self.pickerStyle.selectRowTextColor || self.pickerStyle.selectRowTextFont) {
+        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+            // 当前选中的 label
+            UILabel *selectLabel = (UILabel *)[pickerView viewForRow:row forComponent:component];
+            if (selectLabel) {
+                if (self.pickerStyle.selectRowTextColor) {
+                    selectLabel.textColor = self.pickerStyle.selectRowTextColor;
+                }
+                if (self.pickerStyle.selectRowTextFont) {
+                    selectLabel.font = self.pickerStyle.selectRowTextFont;
+                }
+            }
+        });
+    }
+}
+
+// 4.滚动 pickerView 执行的回调方法
+- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
+    switch (self.pickerMode) {
+        case BRStringPickerComponentSingle:
+        {
+            self.selectIndex = row;
+            
+            // 滚动选择时执行 changeModelBlock
+            if (self.changeModelBlock) {
+                self.changeModelBlock([self getResultModel]);
+            }
+            
+            // 设置自动选择时,滚动选择时就执行 resultModelBlock
+            if (self.isAutoSelect) {
+                if (self.resultModelBlock) {
+                    self.resultModelBlock([self getResultModel]);
+                }
+            }
+        }
+            break;
+        case BRStringPickerComponentMulti:
+        {
+            if (component < self.selectIndexs.count) {
+                NSMutableArray *mutableArr = [self.selectIndexs mutableCopy];
+                [mutableArr replaceObjectAtIndex:component withObject:@(row)];
+                self.selectIndexs = [mutableArr copy];
+            }
+            
+            // 滚动选择时执行 changeModelArrayBlock
+            if (self.changeModelArrayBlock) {
+                self.changeModelArrayBlock([self getResultModelArr]);
+            }
+            
+            // 设置自动选择时,滚动选择时就执行 resultModelArrayBlock
+            if (self.isAutoSelect) {
+                if (self.resultModelArrayBlock) {
+                    self.resultModelArrayBlock([self getResultModelArr]);
+                }
+            }
+        }
+            break;
+        case BRStringPickerComponentLinkage:
+        {
+            if (component < self.selectIndexs.count) {
+                NSMutableArray *selectIndexs = [[NSMutableArray alloc]init];
+                for (NSInteger i = 0; i < self.selectIndexs.count; i++) {
+                    if (i < component) {
+                        [selectIndexs addObject:self.selectIndexs[i]];
+                    } else if (i == component) {
+                        [selectIndexs addObject:@(row)];
+                    } else {
+                        [selectIndexs addObject:@(0)];
+                    }
+                }
+                self.selectIndexs = [selectIndexs copy];
+            }
+            
+            // 刷新选择器数据
+            [self reloadData];
+            
+            // 滚动选择时执行 changeModelArrayBlock
+            if (self.changeModelArrayBlock) {
+                self.changeModelArrayBlock([self getResultModelArr]);
+            }
+            
+            // 设置自动选择时,滚动选择时就执行 resultModelArrayBlock
+            if (self.isAutoSelect) {
+                if (self.resultModelArrayBlock) {
+                    self.resultModelArrayBlock([self getResultModelArr]);
+                }
+            }
+        }
+            break;
+            
+        default:
+            break;
+    }
+}
+
+#pragma mark - 获取【单列】选择器选择的值
+- (BRResultModel *)getResultModel {
+    id item = self.selectIndex < self.mDataSourceArr.count ? self.mDataSourceArr[self.selectIndex] : nil;
+    if ([item isKindOfClass:[BRResultModel class]]) {
+        BRResultModel *model = (BRResultModel *)item;
+        model.index = self.selectIndex;
+        return model;
+    } else {
+        BRResultModel *model = [[BRResultModel alloc]init];
+        model.index = self.selectIndex;
+        model.value = item;
+        return model;
+    }
+}
+
+#pragma mark - 获取【多列】选择器选择的值
+- (NSArray *)getResultModelArr {
+    NSMutableArray *resultModelArr = [[NSMutableArray alloc]init];
+    for (NSInteger i = 0; i < self.mDataSourceArr.count; i++) {
+        NSInteger index = [self.selectIndexs[i] integerValue];
+        NSArray *dataArr = self.mDataSourceArr[i];
+        
+        id item = index < dataArr.count ? dataArr[index] : nil;
+        if ([item isKindOfClass:[BRResultModel class]]) {
+            BRResultModel *model = (BRResultModel *)item;
+            model.index = index;
+            [resultModelArr addObject:model];
+        } else {
+            BRResultModel *model = [[BRResultModel alloc]init];
+            model.index = index;
+            model.value = item;
+            [resultModelArr addObject:model];
+        }
+    }
+    return [resultModelArr copy];
+}
+
+// 设置行高
+- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component {
+    return self.pickerStyle.rowHeight;
+}
+
+#pragma mark - 重写父类方法
+- (void)reloadData {
+    // 1.处理数据源
+    [self handlerPickerData];
+    // 2.刷新选择器
+    [self.pickerView reloadAllComponents];
+    // 3.滚动到选择的值
+    if (self.pickerMode == BRStringPickerComponentSingle) {
+        [self.pickerView selectRow:self.selectIndex inComponent:0 animated:NO];
+    } else if (self.pickerMode == BRStringPickerComponentMulti || self.pickerMode == BRStringPickerComponentLinkage) {
+        for (NSInteger i = 0; i < self.selectIndexs.count; i++) {
+            NSNumber *index = [self.selectIndexs objectAtIndex:i];
+            [self.pickerView selectRow:[index integerValue] inComponent:i animated:NO];
+        }
+    }
+}
+
+- (void)addPickerToView:(UIView *)view {
+    // 1.添加选择器
+    if (view) {
+        // 立即刷新容器视图 view 的布局(防止 view 使用自动布局时,选择器视图无法正常显示)
+        [view setNeedsLayout];
+        [view layoutIfNeeded];
+        
+        self.frame = view.bounds;
+        CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
+        CGFloat pickerFooterViewHeight = self.pickerFooterView ? self.pickerFooterView.bounds.size.height : 0;
+        self.pickerView.frame = CGRectMake(0, pickerHeaderViewHeight, view.bounds.size.width, view.bounds.size.height - pickerHeaderViewHeight - pickerFooterViewHeight);
+        [self addSubview:self.pickerView];
+    } else {
+        [self.alertView addSubview:self.pickerView];
+    }
+    
+    // 2.绑定数据
+    [self reloadData];
+    
+    @weakify(self)
+    self.doneBlock = ^{
+        @strongify(self)
+        // 点击确定按钮后,执行block回调
+        [self removePickerFromView:view];
+        
+        if (self.pickerMode == BRStringPickerComponentSingle) {
+            if (self.resultModelBlock) {
+                self.resultModelBlock([self getResultModel]);
+            }
+        } else if (self.pickerMode == BRStringPickerComponentMulti || self.pickerMode == BRStringPickerComponentLinkage) {
+            if (self.resultModelArrayBlock) {
+                self.resultModelArrayBlock([self getResultModelArr]);
+            }
+        }
+    };
+    
+    [super addPickerToView:view];
+}
+
+#pragma mark - 重写父类方法
+- (void)addSubViewToPicker:(UIView *)customView {
+    [self.pickerView addSubview:customView];
+}
+
+#pragma mark - 弹出选择器视图
+- (void)show {
+    [self addPickerToView:nil];
+}
+
+#pragma mark - 关闭选择器视图
+- (void)dismiss {
+    [self removePickerFromView:nil];
+}
+
+#pragma mark - setter 方法
+- (void)setPlistName:(NSString *)plistName {
+    NSString *path = [[NSBundle mainBundle] pathForResource:plistName ofType:nil];
+    if (path && path.length > 0) {
+        self.dataSourceArr = [[NSArray alloc] initWithContentsOfFile:path];
+    }
+}
+
+- (void)setSelectValue:(NSString *)selectValue {
+    self.mSelectValue = selectValue;
+}
+
+- (void)setSelectValues:(NSArray<NSString *> *)selectValues {
+    self.mSelectValues = selectValues;
+}
+
+#pragma mark - getter 方法
+- (NSArray *)mDataSourceArr {
+    if (!_mDataSourceArr) {
+        _mDataSourceArr = [NSArray array];
+    }
+    return _mDataSourceArr;
+}
+
+- (NSArray<NSNumber *> *)selectIndexs {
+    if (!_selectIndexs) {
+        _selectIndexs = [NSArray array];
+    }
+    return _selectIndexs;
+}
+
+- (NSArray<NSString *> *)mSelectValues {
+    if (!_mSelectValues) {
+        _mSelectValues = [NSArray array];
+    }
+    return _mSelectValues;
+}
+
+- (NSInteger)numberOfComponents {
+    if (_numberOfComponents <= 0) {
+        _numberOfComponents = 3;
+    }
+    return _numberOfComponents;
+}
+
+@end

+ 21 - 0
Pods/BRPickerView/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 91renb
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 492 - 0
Pods/BRPickerView/README.md

@@ -0,0 +1,492 @@
+# BRPickerView
+
+BRPickerView 封装的是iOS中常用的选择器组件,主要包括:日期选择器(支持年月日、年月等15种日期样式选择,支持设置星期、至今等)、地址选择器(支持省市区、省市、省三种地区选择)、自定义字符串选择器(支持单列、多列、二级联动、三级联动选择)。支持自定义主题样式,适配深色模式,支持将选择器组件添加到指定容器视图。
+
+【说明】
+
+- 当前最新版本为: `2.7.0` 。
+- 如果不能找到最新版本,请先执行一下 `pod repo update` 更新本地仓库,待更新完成后;再执行 `pod search BRPickerView` 进行搜索,就会看到最新版本。
+
+# 效果演示
+
+查看并运行 `BRPickerViewDemo.xcodeproj`
+
+| ![效果图1](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/a.gif?raw=true) | ![效果图2](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/b.gif?raw=true) |
+| :----------------------------------------------------------: | :----------------------------------------------------------: |
+|                     框架Demo运行效果图1                      |                     框架Demo运行效果图2                      |
+
+# 安装
+
+#### 1. CocoaPods
+
+1. 在 Podfile 中添加 `pod 'BRPickerView'`。
+
+2. 执行 `pod install` 或 `pod update` 。
+
+3. 导入头文件 ` #import <BRPickerView.h>`。
+
+
+#### 2. 手动导入
+
+1. 将与 `README.md` 同级目录下的 `BRPickerView` 文件夹拽入项目中
+
+2. 导入头文件 ` #import "BRPickerView.h"`。
+
+
+# 系统要求
+
+- iOS 8.0+
+- ARC
+
+# 使用
+
+#### 1. 时间选择器:`BRDatePickerView`
+
+​	查看 BRDatePickerView.h 头文件,里面提供了两种使用方式,参见源码。
+
+```objective-c
+/// 日期选择器格式
+typedef NS_ENUM(NSInteger, BRDatePickerMode) {
+    // ----- 以下4种是系统样式(兼容国际化日期格式) -----
+    /** 【yyyy-MM-dd】UIDatePickerModeDate(美式日期:MM-dd-yyyy;英式日期:dd-MM-yyyy)*/
+    BRDatePickerModeDate,
+    /** 【yyyy-MM-dd HH:mm】 UIDatePickerModeDateAndTime */
+    BRDatePickerModeDateAndTime,
+    /** 【HH:mm】UIDatePickerModeTime */
+    BRDatePickerModeTime,
+    /** 【HH:mm】UIDatePickerModeCountDownTimer */
+    BRDatePickerModeCountDownTimer,
+    
+    // ----- 以下11种是自定义样式 -----
+    /** 【yyyy-MM-dd HH:mm:ss】年月日时分秒 */
+    BRDatePickerModeYMDHMS,
+    /** 【yyyy-MM-dd HH:mm】年月日时分 */
+    BRDatePickerModeYMDHM,
+    /** 【yyyy-MM-dd HH】年月日时 */
+    BRDatePickerModeYMDH,
+    /** 【MM-dd HH:mm】月日时分 */
+    BRDatePickerModeMDHM,
+    /** 【yyyy-MM-dd】年月日(兼容国际化日期:dd-MM-yyyy)*/
+    BRDatePickerModeYMD,
+    /** 【yyyy-MM】年月(兼容国际化日期:MM-yyyy)*/
+    BRDatePickerModeYM,
+    /** 【yyyy】年 */
+    BRDatePickerModeY,
+    /** 【MM-dd】月日 */
+    BRDatePickerModeMD,
+    /** 【HH:mm:ss】时分秒 */
+    BRDatePickerModeHMS,
+    /** 【HH:mm】时分 */
+    BRDatePickerModeHM,
+    /** 【mm:ss】分秒 */
+    BRDatePickerModeMS
+};
+```
+
+- 使用示例(参考Demo):
+
+```objective-c
+// 1.创建日期选择器
+BRDatePickerView *datePickerView = [[BRDatePickerView alloc]init];
+// 2.设置属性
+datePickerView.pickerMode = BRDatePickerModeYMD;
+datePickerView.title = @"选择年月日";
+// datePickerView.selectValue = @"2019-10-30";
+datePickerView.selectDate = [NSDate br_setYear:2019 month:10 day:30];
+datePickerView.minDate = [NSDate br_setYear:1949 month:3 day:12];
+datePickerView.maxDate = [NSDate date];
+datePickerView.isAutoSelect = YES;
+datePickerView.resultBlock = ^(NSDate *selectDate, NSString *selectValue) {
+    NSLog(@"选择的值:%@", selectValue);
+};
+// 设置自定义样式
+BRPickerStyle *customStyle = [[BRPickerStyle alloc]init];
+customStyle.pickerColor = BR_RGB_HEX(0xd9dbdf, 1.0f);
+customStyle.pickerTextColor = [UIColor redColor];
+customStyle.separatorColor = [UIColor redColor];
+datePickerView.pickerStyle = customStyle;
+
+// 3.显示
+[datePickerView show];
+```
+
+**时间选择器显示类型的效果图(默认样式):**
+
+- 以下4种样式是使用 UIDatePicker 类 进行封装的,支持循环滚动
+
+| ![样式1:BRDatePickerModeTime](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type1.png?raw=true) | ![样式2:BRDatePickerModeDate](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type2.png?raw=true) |
+| :----------------------------------------------------------: | :----------------------------------------------------------: |
+|                 样式1:BRDatePickerModeDate                  |              样式2:BRDatePickerModeDateAndTime              |
+|                                                              |                                                              |
+| ![样式3:BRDatePickerModeDateAndTime](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type3.png?raw=true) | ![样式4:BRDatePickerModeCountDownTimer](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type4.png?raw=true) |
+|                 样式3:BRDatePickerModeTime                  |            样式4:BRDatePickerModeCountDownTimer             |
+
+- 以下11种样式是使用 UIPickerView 类进行封装的。
+
+| ![样式5:BRDatePickerModeYMDHMS](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type5.png?raw=true) | ![样式6:BRDatePickerModeYMDHM](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type6.png?raw=true) |
+| :----------------------------------------------------------: | :----------------------------------------------------------: |
+|                样式5:BRDatePickerModeYMDHMS                 |                 样式6:BRDatePickerModeYMDHM                 |
+|                                                              |                                                              |
+| ![样式7:BRDatePickerModeYMDH](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type7.png?raw=true) | ![样式8:BRDatePickerModeMDHM](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type8.png?raw=true) |
+|                 样式7:BRDatePickerModeYMDH                  |                 样式8:BRDatePickerModeMDHM                  |
+|                                                              |                                                              |
+| ![样式9:BRDatePickerModeYMDE](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type9.png?raw=true) | ![样式10:BRDatePickerModeYMD](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type10.png?raw=true) |
+|                  样式9:BRDatePickerModeYMD                  |                  样式10:BRDatePickerModeYM                  |
+|                                                              |                                                              |
+| ![样式11:BRDatePickerModeYM](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type11.png?raw=true) | ![样式12:BRDatePickerModeY](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type12.png?raw=true) |
+|                  样式11:BRDatePickerModeY                   |                  样式12:BRDatePickerModeMD                  |
+|                                                              |                                                              |
+| ![样式13:BRDatePickerModeMD](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type13.png?raw=true) | ![样式14:BRDatePickerModeHMS](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type14.png?raw=true) |
+|                 样式13:BRDatePickerModeHMS                  |                  样式14:BRDatePickerModeHM                  |
+|                                                              |                                                              |
+| ![样式15:BRDatePickerModeHM](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type15.png?raw=true) |                                                              |
+|                  样式15:BRDatePickerModeMS                  |                                                              |
+
+- 其它日期样式
+
+| ![设置显示星期](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type_week1.png?raw=true) | ![设置显示星期](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type_week2.png?raw=true) |
+| ------------------------------------------------------------ | ------------------------------------------------------------ |
+| 设置显示星期:datePickerView.showWeek = YES;                 | 设置显示星期:datePickerView.showWeek = YES;                 |
+|                                                              |                                                              |
+| ![设置添加至今](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type_now.png?raw=true) | ![设置显示今天](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type_today.png?raw=true) |
+| 设置添加至今:datePickerView.addToNow = YES;                 | 设置显示今天:datePickerView.showToday = YES;                |
+|                                                              |                                                              |
+| ![日期单位单行显示样式](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type_unit.png?raw=true) | ![自定义选择器选中行颜色](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type_row.png?raw=true) |
+| 日期单位显示样式:datePickerView.showUnitType = BRShowUnitTypeOnlyCenter; | 设置选择器中间选中行的背景颜色:selectRowColor               |
+
+```objective-c
+// 设置选择器中间选中行的样式
+BRPickerStyle *customStyle = [[BRPickerStyle alloc]init];
+customStyle.selectRowColor = [UIColor blueColor];
+customStyle.selectRowTextFont = [UIFont boldSystemFontOfSize:20.0f];
+customStyle.selectRowTextColor = [UIColor redColor];
+datePickerView.pickerStyle = customStyle;
+```
+
+| ![英式日期年月日](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type_en1.png?raw=true) | ![英式日期年月](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type_en2.png?raw=true) |
+| ------------------------------------------------------------ | ------------------------------------------------------------ |
+| 样式:BRDatePickerModeYMD (默认非中文环境显示英式日期)     | 样式:BRDatePickerModeYM (默认非中文环境显示英式日期)      |
+
+- 几种常见的弹框样式模板
+
+| ![模板样式1](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/template_style1.png?raw=true) | ![模板样式2](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/template_style2.png?raw=true) |
+| ------------------------------------------------------------ | ------------------------------------------------------------ |
+| 弹框样式模板1:datePickerView.pickerStyle = [BRPickerStyle pickerStyleWithThemeColor:[UIColor blueColor]]; | 弹框样式模板2:datePickerView.pickerStyle = [BRPickerStyle pickerStyleWithDoneTextColor:[UIColor blueColor]]; |
+|                                                              |                                                              |
+| ![模板样式3](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/template_style3.png?raw=true) | ![添加选择器的头视图](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/date_type_top.png?raw=true) |
+| 弹框样式模板3:datePickerView.pickerStyle = [BRPickerStyle pickerStyleWithDoneBtnImage:[UIImage imageNamed:@"icon_close"]]; | 添加选择器的头视图:pickerHeaderView                         |
+
+```objective-c
+// 添加选择器头视图(pickerHeaderView)
+UIView *headerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 36)];
+headerView.backgroundColor = [[UIColor grayColor] colorWithAlphaComponent:0.1f];
+NSArray *unitArr = @[@"年", @"月", @"日"];
+for (NSInteger i = 0; i < unitArr.count; i++) {
+    CGFloat width = SCREEN_WIDTH / unitArr.count;
+    CGFloat orginX = i * (SCREEN_WIDTH / unitArr.count);
+    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(orginX, 0, width, 36)];
+    label.backgroundColor = [UIColor clearColor];
+    label.textAlignment = NSTextAlignmentCenter;
+    label.font = [UIFont systemFontOfSize:16.0f];
+    label.textColor = [UIColor darkGrayColor];
+    label.text = unitArr[i];
+    [headerView addSubview:label];
+}
+datePickerView.pickerHeaderView = headerView;
+```
+
+#### 2. 地址选择器:`BRAddressPickerView`
+
+​	查看 BRAddressPickerView.h 头文件,里面提供了两种使用方式,参见源码。
+
+- 使用示例(参考Demo):
+
+```objective-c
+/// 地址选择器
+BRAddressPickerView *addressPickerView = [[BRAddressPickerView alloc]init];
+addressPickerView.pickerMode = BRAddressPickerModeArea;
+addressPickerView.title = @"请选择地区";
+//addressPickerView.selectValues = @[@"浙江省", @"杭州市", @"西湖区"];
+addressPickerView.selectIndexs = @[@10, @0, @4];
+addressPickerView.isAutoSelect = YES;
+addressPickerView.resultBlock = ^(BRProvinceModel *province, BRCityModel *city, BRAreaModel *area) {
+    NSLog(@"选择的值:%@", [NSString stringWithFormat:@"%@ %@ %@", province.name, city.name, area.name]);
+};
+
+[addressPickerView show];
+```
+
+- 地址选择器的3种显示类型(showType 的3个枚举值):
+
+| ![省份](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/BRAddressPickerModeProvince.png?raw=true) | ![城市](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/BRAddressPickerModeCity.png?raw=true) |
+| :----------------------------------------------------------: | :----------------------------------------------------------: |
+|              样式1:BRAddressPickerModeProvince              |                样式2:BRAddressPickerModeCity                |
+|                                                              |                                                              |
+| ![地区](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/BRAddressPickerModeArea.png?raw=true) |                                                              |
+|                样式3:BRAddressPickerModeArea                |                                                              |
+
+#### 3.  自定义字符串选择器:`BRStringPickerView`
+
+​	查看 BRStringPickerView.h 头文件,里面提供了两种使用方式,参见源码。
+
+- 使用示例(参考Demo):
+
+```objective-c
+/// 1.单列字符串选择器(传字符串数组)
+BRStringPickerView *stringPickerView = [[BRStringPickerView alloc]init];
+stringPickerView.pickerMode = BRStringPickerComponentSingle;
+stringPickerView.title = @"学历";
+stringPickerView.dataSourceArr = @[@"大专以下", @"大专", @"本科", @"硕士", @"博士", @"博士后"];
+stringPickerView.selectIndex = 2;
+stringPickerView.resultModelBlock = ^(BRResultModel *resultModel) {
+    NSLog(@"选择的值:%@", resultModel.value);
+};
+
+[stringPickerView show];
+
+
+/// 2.单列字符串选择器(可以传模型数组)
+NSArray *infoArr = @[@{@"key": @"1001", @"value": @"无融资", @"remark": @""},
+                     @{@"key": @"2001", @"value": @"天使轮", @"remark": @""},
+                     @{@"key": @"3001", @"value": @"A轮", @"remark": @""},
+                     @{@"key": @"4001", @"value": @"B轮", @"remark": @""},
+                     @{@"key": @"5001", @"value": @"C轮以后", @"remark": @""},
+                     @{@"key": @"6001", @"value": @"已上市", @"remark": @""}];
+NSMutableArray *modelArr = [[NSMutableArray alloc]init];
+for (NSDictionary *dic in infoArr) {
+    BRResultModel *model = [[BRResultModel alloc]init];
+    model.key = dic[@"key"];
+    model.value = dic[@"value"];
+    model.remark = dic[@"remark"];
+    [modelArr addObject:model];
+}
+BRStringPickerView *stringPickerView = [[BRStringPickerView alloc]init];
+stringPickerView.pickerMode = BRStringPickerComponentSingle;
+stringPickerView.title = @"融资情况";
+stringPickerView.dataSourceArr = [modelArr copy];
+stringPickerView.selectIndex = 2;
+stringPickerView.resultModelBlock = ^(BRResultModel *resultModel) {
+    NSLog(@"选择的索引:%@", @(resultModel.index));
+    NSLog(@"选择的值:%@", resultModel.value);
+};
+
+[stringPickerView show];
+
+
+/// 3.多列字符串选择器
+BRStringPickerView *stringPickerView = [[BRStringPickerView alloc]init];
+stringPickerView.pickerMode = BRStringPickerComponentMulti;
+stringPickerView.title = @"自定义多列字符串";
+stringPickerView.dataSourceArr = @[@[@"语文", @"数学", @"英语", @"物理", @"化学", @"生物"], @[@"优秀", @"良好", @"及格", @"不及格"]];
+stringPickerView.selectIndexs = @[@2, @1];
+stringPickerView.resultModelArrayBlock = ^(NSArray<BRResultModel *> *resultModelArr) {
+    NSLog(@"选择的值:%@", [NSString stringWithFormat:@"%@,%@", resultModelArr[0].value, resultModelArr[1].value]);
+};
+
+// 设置选择器中间选中行的样式
+BRPickerStyle *customStyle = [[BRPickerStyle alloc]init];
+customStyle.selectRowTextFont = [UIFont boldSystemFontOfSize:20.0f];
+customStyle.selectRowTextColor = [UIColor blueColor];
+stringPickerView.pickerStyle = customStyle;
+
+[stringPickerView show];
+```
+
+- 字符串选择器效果图:
+
+| ![自定义单列字符串](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/string_single.png?raw=true) | ![融资情况](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/string_rongzi.png?raw=true) |
+| :----------------------------------------------------------: | :----------------------------------------------------------: |
+|                       单列字符串选择器                       |                       单列字符串选择器                       |
+|                                                              |                                                              |
+| ![多列字符串选择器](https://github.com/91renb/BRPickerView/blob/master/BRPickerViewDemo/images/string_more.png?raw=true) |                                                              |
+|                       多列字符串选择器                       |                                                              |
+
+# 更新记录
+
+#### 2020-08-28(V2.7.0)
+
+- 日期选择器添加 `nonSelectableDates` 属性:[#178](https://github.com/91renb/BRPickerView/issues/178) 
+- 优化选中行文本显示:[#177](https://github.com/91renb/BRPickerView/issues/177) 
+
+#### 2020-08-16(V2.6.8)
+
+- 优化代码,适配 iPad 分屏显示
+- 新增 `keyView` 属性(即组件的父视图:可以将组件添加到 自己获取的 keyWindow 上,或页面的 view 上)
+
+#### 2020-08-09(V2.6.7)
+
+- 适配 iOS14
+
+#### 2020-08-06(V2.6.6)
+
+- 修复 [#163](https://github.com/91renb/BRPickerView/issues/163) 和  [#170](https://github.com/91renb/BRPickerView/issues/170) 
+
+#### 2020-07-18(V2.6.5)
+
+- 字符串选择器新增支持多级联动选择
+
+#### 2020-06-24(V2.6.3)
+
+- 日期选择器新增属性:`timeZone` 和 `addCustomString`
+
+#### 2020-05-12(V2.6.2)
+
+- 实现 [#145](#145) 和  [#146](#146) 需求
+
+#### 2020-04-30(V2.6.0)
+
+- 新增样式属性:`selectRowTextColor` 和 `selectRowTextFont`
+- 日期选择器新增数字显示属性:`numberFullName`
+- 优化代码,添加 `BRDatePickerModeYMD` 支持国际化英式日期
+
+- 修复 [#143](#143)
+
+#### 2020-04-27(V2.5.8)
+
+- 修复 [#138](https://github.com/91renb/BRPickerView/issues/138) 和 [#142](https://github.com/91renb/BRPickerView/issues/142)
+- 日期选择器新增 `descending` 属性,支持降序的时间列表
+- 更新地址选择器地区数据源
+
+#### 2020-03-31(V2.5.7)
+
+- 优化代码,解决已知问题
+
+#### 2020-02-26(V2.5.6)
+
+- 优化代码,兼容部分国际化日期样式
+
+#### 2020-02-24(V2.5.5)
+
+- 添加设置选择器选中行背景颜色的功能,新增属性 `selectRowColor`
+
+#### 2020-01-31(V2.5.3)
+
+- 新增属性:`pickerHeaderView`、`pickerFooterView`
+- 新增刷新选择器数据方法:`reloadData`
+
+#### 2020-01-05(V2.5.1)
+
+- 优化代码,添加 `BRDatePickerModeYM` 支持国际化英式日期
+
+#### 2020-01-02(V2.5.0)
+
+- 日期选择器新增属性:`showUnitType`(日期单位显示样式)、`minuteInterval`、`secondInterval`
+- 封装了常用的几种模板样式,使用更加简单便捷
+- 框架内默认适配深色模式显示
+
+#### 2019-12-26(V2.4.6)
+
+- 添加支持动态更新属性 `title` 、 `selectDate`、`pickerMode` 的值
+- 日期选择器添加 `showWeek` 属性,及新增 `BRDatePickerModeMS` 日期类型
+- 优化选择器【用法二】的使用,新增选择器滚动选择时回调的属性
+
+#### 2019-11-28(V2.4.5)
+
+- 日期选择器新增选择 ”至今“ 和 显示 ”今天“ 的功能,见以下两个属性:
+
+  `showToday` :控制是否显示 “今天” ,默认为 NO
+
+  `addToNow`:控制是否添加选择 “至今”,默认为 NO
+
+#### 2019-11-26(V2.4.3)
+
+- 日期选择器新增以下三种选择类型:
+
+  `BRDatePickerModeYMDHMS`(年月日时分秒)、`BRDatePickerModeYMDE`(年月日星期)、`BRDatePickerModeHMS`(时分秒)
+
+- 更新地址选择器地区数据源
+
+#### 2019-11-07(V2.4.2)
+
+- 日期选择器添加:BRDatePickerModeYMDH(yyyy-MM-dd HH)类型
+- 地址选择器添加:selectIndexs 属性,可根据索引去设置默认选择
+- 适配横屏及刘海屏安全区域显示效果
+
+#### 2019-11-04(V2.4.0)
+
+- 优化选择器子目录管理,方便轻量级、模块化集成
+
+  `pod 'BRPickerView'`	// 集成全部的功能
+
+  `pod 'BRPickerView/DatePickerView'`	// 仅集成日期选择器的功能
+
+  `pod 'BRPickerView/AddressPickerView'`	// 仅集成地址选择器的功能
+
+  `pod 'BRPickerView/StringPickerView'`	// 仅集成字符串选择器的功能
+
+#### 2019-11-01(V2.3.8)
+
+- 优化代码,添加更多的自定义样式属性
+
+#### 2019-10-30(V2.3.6)
+
+- 优化代码,添加国际化支持
+
+#### 2019-10-26(V2.3.5)
+
+- 添加传统的创建对象设置属性的使用方式
+- 开放设置选择器颜色及样式,适配深色模式
+- 更新省市区数据源,数据与政府官网最新公布的一致(参见:[行政区划代码](http://www.mca.gov.cn/article/sj/xzqh/2019/))
+- 支持将选择器添加到指定容器视图上(见BaseView.h文件,扩展一方法)
+- 支持将子视图添加到选择器上(见BaseView.h文件,扩展二方法)
+- 优化代码,配置Pod库的层级目录
+
+#### 2018-04-27(V2.2.1):
+
+- 修复bug,适配iPad和横屏显示。
+- 优化代码,提高框架适应性,降低内存消耗。
+
+#### 2018-04-03(V2.2.0)
+
+- 时间选择器新添加了7种显示类型(BRDatePickerMode),可根据自己项目的需求选择性使用。
+- 适配横屏,及 iPhoneX 底部安全区域。
+- 修改了最小时间和最大时间的参数名称(以前版本是传 NSString 类型, 现在传 NSDate 类型)
+- 修复比较时间大小时出现的bug。
+
+#### 2018-03-19(V2.1.3)
+
+- 修改地址选择器确认选择后的回调参数。
+- 现修改如下:可通过省市区的模型获取省市区的 name(名称)、code(id)、index(索引)`resultBlock:^(BRProvinceModel *province, BRCityModel *city, BRAreaModel *area) {}`
+- 去掉第三方依赖库 `MJExtension` ,修改为手动解析地址数据源。
+
+#### 2018-03-11(V2.1.2)
+
+- 重命名了Github用户名,更新项目相关的路径。(提示:pod之前的版本不受影响)
+
+#### 2018-02-28(V2.1.1)
+
+- 修复某些情况下无法用bundle加载本地数据源(BRCity.plist)bug。
+
+#### 2018-01-26(V2.1.0)
+
+- 给地址选择器添加了一个方法(见方法4),提供数据源参数,支持外部传入地区数据源。
+- 提示:要注意数据源格式,参考 BRCity.json。可以把 BRCity.json 文件的内容放到后台去维护,通过后台接口获取地区数据源(即 BRCity.json 文件的内容)。
+
+#### 2018-01-25(V2.0.0)
+
+- 更新了地址数据源(BRCity.plist),地区信息是2018年最新最全的,与微信的地区信息完全一致。
+- 支持自定义默认选择地址(格式:@[@"浙江省", @"杭州市", @"西湖区"]),支持下次点击进入地址选择器时,默认地址为上次选择的结果。
+- 修改了日期选择器、地址选择器、字符串选择器的接口方法(删除了之前的方法2)。
+- 添加了地址选择器显示类型,支持3种显示:只显示省份、显示省份和城市、显示省市区。
+
+#### 2018-01-05(V1.3.0)
+
+- 添加取消选择的回调方法(点击背景或取消按钮会执行 `cancelBlock` )
+- 合并了字符串选择器 数组数据源和plist数据源对应的方法,`dataSource` 参数支持两种类型:
+
+#### 2018-01-02(V1.2.0)
+
+- 添加支持自定义主题颜色的方法。
+
+#### 2017-11-26(V1.1.0)
+
+- 更换第三方依赖库。
+- 用MJExtension 替换了 原来的YYModel,以前没有注意导入YYModel,同时又导入YYKit会导致重复导入而冲突(另外使用YYModel时,手动导入和pod导入 其中的头文件和方法名也不一样,所以很容易出错)。
+
+#### 2017-11-16(V1.0.0)
+
+- 初始版本!
+
+# 许可证
+
+BRPickerView 使用 MIT 许可证,详情见 LICENSE 文件。

+ 16 - 1
Pods/Manifest.lock

@@ -14,6 +14,18 @@ PODS:
   - AFNetworking/Serialization (4.0.1)
   - AFNetworking/UIKit (4.0.1):
     - AFNetworking/NSURLSession
+  - BRPickerView (2.7.0):
+    - BRPickerView/AddressPickerView (= 2.7.0)
+    - BRPickerView/Base (= 2.7.0)
+    - BRPickerView/DatePickerView (= 2.7.0)
+    - BRPickerView/StringPickerView (= 2.7.0)
+  - BRPickerView/AddressPickerView (2.7.0):
+    - BRPickerView/Base
+  - BRPickerView/Base (2.7.0)
+  - BRPickerView/DatePickerView (2.7.0):
+    - BRPickerView/Base
+  - BRPickerView/StringPickerView (2.7.0):
+    - BRPickerView/Base
   - FDFullscreenPopGesture (1.1)
   - FLAnimatedImage (1.0.12)
   - FMDB (2.7.5):
@@ -75,6 +87,7 @@ PODS:
 
 DEPENDENCIES:
   - AFNetworking
+  - BRPickerView
   - FDFullscreenPopGesture (= 1.1)
   - FLAnimatedImage
   - FMDB
@@ -104,6 +117,7 @@ DEPENDENCIES:
 SPEC REPOS:
   https://github.com/CocoaPods/Specs.git:
     - AFNetworking
+    - BRPickerView
     - FDFullscreenPopGesture
     - FLAnimatedImage
     - FMDB
@@ -130,6 +144,7 @@ SPEC REPOS:
 
 SPEC CHECKSUMS:
   AFNetworking: 7864c38297c79aaca1500c33288e429c3451fdce
+  BRPickerView: 882991201e8a27b9f41e4b6888d2871418e71f84
   FDFullscreenPopGesture: a8a620179e3d9c40e8e00256dcee1c1a27c6d0f0
   FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31
   FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
@@ -154,6 +169,6 @@ SPEC CHECKSUMS:
   YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30
   ZFPlayer: 8a6021a3c45e281f2abd24dca5c88915af770a7e
 
-PODFILE CHECKSUM: 815247f1ed93cb28b18fdb5bbea62a0dec47f5b4
+PODFILE CHECKSUM: befcc3aac57bf08cb530cb3631624d7f3720df95
 
 COCOAPODS: 1.8.4

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 2806 - 2495
Pods/Pods.xcodeproj/project.pbxproj


+ 60 - 0
Pods/Pods.xcodeproj/xcuserdata/niuzhen.xcuserdatad/xcschemes/BRPickerView.xcscheme

@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1100"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForAnalyzing = "YES"
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "D505645C3F99EB1E8B6529D64D2C3E1C"
+               BuildableName = "BRPickerView.framework"
+               BlueprintName = "BRPickerView"
+               ReferencedContainer = "container:Pods.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      buildConfiguration = "Debug">
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      buildConfiguration = "Debug"
+      allowLocationSimulation = "YES">
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES"
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 5 - 0
Pods/Pods.xcodeproj/xcuserdata/niuzhen.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -9,6 +9,11 @@
 			<key>isShown</key>
 			<false/>
 		</dict>
+		<key>BRPickerView.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
 		<key>FDFullscreenPopGesture.xcscheme</key>
 		<dict>
 			<key>isShown</key>

+ 26 - 0
Pods/Target Support Files/BRPickerView/BRPickerView-Info.plist

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>en</string>
+  <key>CFBundleExecutable</key>
+  <string>${EXECUTABLE_NAME}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>2.7.0</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>${CURRENT_PROJECT_VERSION}</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>

+ 5 - 0
Pods/Target Support Files/BRPickerView/BRPickerView-dummy.m

@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_BRPickerView : NSObject
+@end
+@implementation PodsDummy_BRPickerView
+@end

+ 12 - 0
Pods/Target Support Files/BRPickerView/BRPickerView-prefix.pch

@@ -0,0 +1,12 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+

+ 28 - 0
Pods/Target Support Files/BRPickerView/BRPickerView-umbrella.h

@@ -0,0 +1,28 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
+#import "BRPickerView.h"
+#import "BRAddressModel.h"
+#import "BRAddressPickerView.h"
+#import "BRBaseView.h"
+#import "BRPickerStyle.h"
+#import "BRPickerViewMacro.h"
+#import "NSBundle+BRPickerView.h"
+#import "BRDatePickerView+BR.h"
+#import "BRDatePickerView.h"
+#import "NSDate+BRPickerView.h"
+#import "BRResultModel.h"
+#import "BRStringPickerView.h"
+
+FOUNDATION_EXPORT double BRPickerViewVersionNumber;
+FOUNDATION_EXPORT const unsigned char BRPickerViewVersionString[];
+

+ 6 - 0
Pods/Target Support Files/BRPickerView/BRPickerView.modulemap

@@ -0,0 +1,6 @@
+framework module BRPickerView {
+  umbrella header "BRPickerView-umbrella.h"
+
+  export *
+  module * { export * }
+}

+ 9 - 0
Pods/Target Support Files/BRPickerView/BRPickerView.xcconfig

@@ -0,0 +1,9 @@
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/BRPickerView
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/BRPickerView
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

+ 25 - 0
Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino-acknowledgements.markdown

@@ -24,6 +24,31 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 
 
+## BRPickerView
+
+MIT License
+
+Copyright (c) 2019 91renb
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
 ## FDFullscreenPopGesture
 
 The MIT License (MIT)

+ 31 - 0
Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino-acknowledgements.plist

@@ -43,6 +43,37 @@ THE SOFTWARE.
 		</dict>
 		<dict>
 			<key>FooterText</key>
+			<string>MIT License
+
+Copyright (c) 2019 91renb
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+</string>
+			<key>License</key>
+			<string>MIT</string>
+			<key>Title</key>
+			<string>BRPickerView</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
 			<string>The MIT License (MIT)
 
 Copyright (c) 2015 

+ 1 - 0
Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino-frameworks-Debug-input-files.xcfilelist

@@ -1,5 +1,6 @@
 ${PODS_ROOT}/Target Support Files/Pods-smartRhino/Pods-smartRhino-frameworks.sh
 ${BUILT_PRODUCTS_DIR}/AFNetworking/AFNetworking.framework
+${BUILT_PRODUCTS_DIR}/BRPickerView/BRPickerView.framework
 ${BUILT_PRODUCTS_DIR}/FDFullscreenPopGesture/FDFullscreenPopGesture.framework
 ${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework
 ${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework

+ 1 - 0
Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino-frameworks-Debug-output-files.xcfilelist

@@ -1,4 +1,5 @@
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AFNetworking.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BRPickerView.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FDFullscreenPopGesture.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FLAnimatedImage.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FMDB.framework

+ 1 - 0
Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino-frameworks-Release-input-files.xcfilelist

@@ -1,5 +1,6 @@
 ${PODS_ROOT}/Target Support Files/Pods-smartRhino/Pods-smartRhino-frameworks.sh
 ${BUILT_PRODUCTS_DIR}/AFNetworking/AFNetworking.framework
+${BUILT_PRODUCTS_DIR}/BRPickerView/BRPickerView.framework
 ${BUILT_PRODUCTS_DIR}/FDFullscreenPopGesture/FDFullscreenPopGesture.framework
 ${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework
 ${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework

+ 1 - 0
Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino-frameworks-Release-output-files.xcfilelist

@@ -1,4 +1,5 @@
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AFNetworking.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BRPickerView.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FDFullscreenPopGesture.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FLAnimatedImage.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FMDB.framework

+ 2 - 0
Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino-frameworks.sh

@@ -162,6 +162,7 @@ strip_invalid_archs() {
 
 if [[ "$CONFIGURATION" == "Debug" ]]; then
   install_framework "${BUILT_PRODUCTS_DIR}/AFNetworking/AFNetworking.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/BRPickerView/BRPickerView.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/FDFullscreenPopGesture/FDFullscreenPopGesture.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework"
@@ -182,6 +183,7 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then
 fi
 if [[ "$CONFIGURATION" == "Release" ]]; then
   install_framework "${BUILT_PRODUCTS_DIR}/AFNetworking/AFNetworking.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/BRPickerView/BRPickerView.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/FDFullscreenPopGesture/FDFullscreenPopGesture.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework"

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 4 - 4
Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino.debug.xcconfig


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 4 - 4
Pods/Target Support Files/Pods-smartRhino/Pods-smartRhino.release.xcconfig


+ 1 - 0
podfile

@@ -12,6 +12,7 @@ pod 'ZFPlayer/ControlView'
 pod 'ZFPlayer/AVPlayer'
 pod 'SDWebImage'
 pod 'FLAnimatedImage'
+pod 'BRPickerView'
 pod 'YYModel'
 #pod 'WechatOpenSDK'
 #pod 'WMZPageController','~> 1.1.4'

+ 56 - 0
smartRhino.xcodeproj/project.pbxproj

@@ -802,6 +802,9 @@
 		EB2E470923A4B55D00CAF0D3 /* SmartBar.m in Sources */ = {isa = PBXBuildFile; fileRef = EB2E470823A4B55D00CAF0D3 /* SmartBar.m */; };
 		EB2E470C23A4B78300CAF0D3 /* SmartBarModel.m in Sources */ = {isa = PBXBuildFile; fileRef = EB2E470B23A4B78300CAF0D3 /* SmartBarModel.m */; };
 		EB2E471223A4D32400CAF0D3 /* NewTopicVC.m in Sources */ = {isa = PBXBuildFile; fileRef = EB2E471123A4D32400CAF0D3 /* NewTopicVC.m */; };
+		EB31796B251C6E01001E01D3 /* BookBillArticeCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EB317968251C6E00001E01D3 /* BookBillArticeCell.m */; };
+		EB31796C251C6E01001E01D3 /* BookBillArticeCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = EB31796A251C6E01001E01D3 /* BookBillArticeCell.xib */; };
+		EB317970251CA2D0001E01D3 /* BookBillListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = EB31796E251CA2D0001E01D3 /* BookBillListModel.m */; };
 		EB38513F24652BA700E28172 /* TDGroupRoleVC.m in Sources */ = {isa = PBXBuildFile; fileRef = EB38513E24652BA700E28172 /* TDGroupRoleVC.m */; };
 		EB38514224652EB000E28172 /* TDGroupLabelVC.m in Sources */ = {isa = PBXBuildFile; fileRef = EB38514124652EB000E28172 /* TDGroupLabelVC.m */; };
 		EB38514624653A2200E28172 /* TDGroupLabelCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EB38514424653A2200E28172 /* TDGroupLabelCell.m */; };
@@ -1228,6 +1231,9 @@
 		EB9DA132250333240062FEB8 /* SelectionTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9DA128250333240062FEB8 /* SelectionTableViewCell.m */; };
 		EB9DA133250333240062FEB8 /* SliderTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9DA129250333240062FEB8 /* SliderTableViewCell.m */; };
 		EB9DA134250333240062FEB8 /* InputTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9DA12A250333240062FEB8 /* InputTableViewCell.m */; };
+		EB9E202D251F088000311E96 /* BookMingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9E202B251F088000311E96 /* BookMingCell.m */; };
+		EB9E202E251F088000311E96 /* BookMingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = EB9E202C251F088000311E96 /* BookMingCell.xib */; };
+		EB9E2032251F0BBA00311E96 /* BookMingSearchVC.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9E2030251F0BBA00311E96 /* BookMingSearchVC.m */; };
 		EB9F24DE2509CD0C0017479A /* PlayModelVC.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9F24DD2509CD0C0017479A /* PlayModelVC.m */; };
 		EB9F24E22509CDD90017479A /* PlayModelCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9F24E02509CDD90017479A /* PlayModelCell.m */; };
 		EB9F24E32509CDD90017479A /* PlayModelCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = EB9F24E12509CDD90017479A /* PlayModelCell.xib */; };
@@ -1269,6 +1275,8 @@
 		EBB240312480B46A00EECD15 /* BookPeriodicaListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB2402F2480B46A00EECD15 /* BookPeriodicaListCell.m */; };
 		EBB240322480B46A00EECD15 /* BookPeriodicaListCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = EBB240302480B46A00EECD15 /* BookPeriodicaListCell.xib */; };
 		EBB360BE250736FC0018C830 /* BookListenModel.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB360BD250736FC0018C830 /* BookListenModel.m */; };
+		EBB588CE252064B9005B3988 /* BookGongzhSearchVC.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB588CD252064B9005B3988 /* BookGongzhSearchVC.m */; };
+		EBB588D225208A70005B3988 /* BookProblemModel.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB588D125208A70005B3988 /* BookProblemModel.m */; };
 		EBB6886A23C9C0C300E24DD9 /* MMDatabaseConn.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB6883823C9C0C300E24DD9 /* MMDatabaseConn.m */; };
 		EBB6886B23C9C0C300E24DD9 /* MMDatabaseConn+Initial.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB6883A23C9C0C300E24DD9 /* MMDatabaseConn+Initial.m */; };
 		EBB6886C23C9C0C300E24DD9 /* MMRichTextConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB6883E23C9C0C300E24DD9 /* MMRichTextConfig.m */; };
@@ -1296,6 +1304,8 @@
 		EBB83E4E23B35FD300A8C4BC /* ChangeTopicCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB83E4C23B35FD300A8C4BC /* ChangeTopicCell.m */; };
 		EBB83E4F23B35FD300A8C4BC /* ChangeTopicCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = EBB83E4D23B35FD300A8C4BC /* ChangeTopicCell.xib */; };
 		EBB83E5223B3668C00A8C4BC /* ChangeTopicModel.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB83E5123B3668C00A8C4BC /* ChangeTopicModel.m */; };
+		EBB8D06C251D818B0051C897 /* BookLabelSearchVC.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB8D06A251D818A0051C897 /* BookLabelSearchVC.m */; };
+		EBB8D070251E00600051C897 /* BookBillBoardSearchVC.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB8D06E251E00600051C897 /* BookBillBoardSearchVC.m */; };
 		EBBD5E612519A2D8007B174E /* BookSearchVC.m in Sources */ = {isa = PBXBuildFile; fileRef = EBBD5E5F2519A2D8007B174E /* BookSearchVC.m */; };
 		EBBD5E662519A393007B174E /* BookSearchSubVC.m in Sources */ = {isa = PBXBuildFile; fileRef = EBBD5E642519A392007B174E /* BookSearchSubVC.m */; };
 		EBBD5E6A2519CB4E007B174E /* BookLabelAllVC.m in Sources */ = {isa = PBXBuildFile; fileRef = EBBD5E692519CB4E007B174E /* BookLabelAllVC.m */; };
@@ -2919,6 +2929,11 @@
 		EB2E470B23A4B78300CAF0D3 /* SmartBarModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SmartBarModel.m; sourceTree = "<group>"; };
 		EB2E471023A4D32400CAF0D3 /* NewTopicVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NewTopicVC.h; sourceTree = "<group>"; };
 		EB2E471123A4D32400CAF0D3 /* NewTopicVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NewTopicVC.m; sourceTree = "<group>"; };
+		EB317968251C6E00001E01D3 /* BookBillArticeCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookBillArticeCell.m; sourceTree = "<group>"; };
+		EB317969251C6E00001E01D3 /* BookBillArticeCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookBillArticeCell.h; sourceTree = "<group>"; };
+		EB31796A251C6E01001E01D3 /* BookBillArticeCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BookBillArticeCell.xib; sourceTree = "<group>"; };
+		EB31796E251CA2D0001E01D3 /* BookBillListModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookBillListModel.m; sourceTree = "<group>"; };
+		EB31796F251CA2D0001E01D3 /* BookBillListModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookBillListModel.h; sourceTree = "<group>"; };
 		EB38513D24652BA700E28172 /* TDGroupRoleVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TDGroupRoleVC.h; sourceTree = "<group>"; };
 		EB38513E24652BA700E28172 /* TDGroupRoleVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TDGroupRoleVC.m; sourceTree = "<group>"; };
 		EB38514024652EB000E28172 /* TDGroupLabelVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TDGroupLabelVC.h; sourceTree = "<group>"; };
@@ -3600,6 +3615,11 @@
 		EB9DA12D250333240062FEB8 /* SliderTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SliderTableViewCell.h; sourceTree = "<group>"; };
 		EB9DA12E250333240062FEB8 /* SelectionTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectionTableViewCell.h; sourceTree = "<group>"; };
 		EB9DA12F250333240062FEB8 /* InputTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputTableViewCell.h; sourceTree = "<group>"; };
+		EB9E202A251F088000311E96 /* BookMingCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BookMingCell.h; sourceTree = "<group>"; };
+		EB9E202B251F088000311E96 /* BookMingCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BookMingCell.m; sourceTree = "<group>"; };
+		EB9E202C251F088000311E96 /* BookMingCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BookMingCell.xib; sourceTree = "<group>"; };
+		EB9E2030251F0BBA00311E96 /* BookMingSearchVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookMingSearchVC.m; sourceTree = "<group>"; };
+		EB9E2031251F0BBA00311E96 /* BookMingSearchVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookMingSearchVC.h; sourceTree = "<group>"; };
 		EB9F24DC2509CD0C0017479A /* PlayModelVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlayModelVC.h; sourceTree = "<group>"; };
 		EB9F24DD2509CD0C0017479A /* PlayModelVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PlayModelVC.m; sourceTree = "<group>"; };
 		EB9F24DF2509CDD90017479A /* PlayModelCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlayModelCell.h; sourceTree = "<group>"; };
@@ -3701,6 +3721,10 @@
 		EBB240302480B46A00EECD15 /* BookPeriodicaListCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BookPeriodicaListCell.xib; sourceTree = "<group>"; };
 		EBB360BC250736FC0018C830 /* BookListenModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BookListenModel.h; sourceTree = "<group>"; };
 		EBB360BD250736FC0018C830 /* BookListenModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BookListenModel.m; sourceTree = "<group>"; };
+		EBB588CC252064B9005B3988 /* BookGongzhSearchVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookGongzhSearchVC.h; sourceTree = "<group>"; };
+		EBB588CD252064B9005B3988 /* BookGongzhSearchVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookGongzhSearchVC.m; sourceTree = "<group>"; };
+		EBB588D025208A70005B3988 /* BookProblemModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookProblemModel.h; sourceTree = "<group>"; };
+		EBB588D125208A70005B3988 /* BookProblemModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookProblemModel.m; sourceTree = "<group>"; };
 		EBB6883823C9C0C300E24DD9 /* MMDatabaseConn.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MMDatabaseConn.m; sourceTree = "<group>"; };
 		EBB6883923C9C0C300E24DD9 /* MMDatabaseConn+Initial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MMDatabaseConn+Initial.h"; sourceTree = "<group>"; };
 		EBB6883A23C9C0C300E24DD9 /* MMDatabaseConn+Initial.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MMDatabaseConn+Initial.m"; sourceTree = "<group>"; };
@@ -3755,6 +3779,10 @@
 		EBB83E4D23B35FD300A8C4BC /* ChangeTopicCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ChangeTopicCell.xib; sourceTree = "<group>"; };
 		EBB83E5023B3668C00A8C4BC /* ChangeTopicModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChangeTopicModel.h; sourceTree = "<group>"; };
 		EBB83E5123B3668C00A8C4BC /* ChangeTopicModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChangeTopicModel.m; sourceTree = "<group>"; };
+		EBB8D06A251D818A0051C897 /* BookLabelSearchVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookLabelSearchVC.m; sourceTree = "<group>"; };
+		EBB8D06B251D818A0051C897 /* BookLabelSearchVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookLabelSearchVC.h; sourceTree = "<group>"; };
+		EBB8D06E251E00600051C897 /* BookBillBoardSearchVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookBillBoardSearchVC.m; sourceTree = "<group>"; };
+		EBB8D06F251E00600051C897 /* BookBillBoardSearchVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookBillBoardSearchVC.h; sourceTree = "<group>"; };
 		EBBD5E5F2519A2D8007B174E /* BookSearchVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookSearchVC.m; sourceTree = "<group>"; };
 		EBBD5E602519A2D8007B174E /* BookSearchVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookSearchVC.h; sourceTree = "<group>"; };
 		EBBD5E642519A392007B174E /* BookSearchSubVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookSearchSubVC.m; sourceTree = "<group>"; };
@@ -7875,6 +7903,10 @@
 				EBD4A1F9250B54FD0088D94F /* BookListenSubModel.m */,
 				EBD4A1FB250B5B4D0088D94F /* BookRecommendModel.h */,
 				EBD4A1FC250B5B4D0088D94F /* BookRecommendModel.m */,
+				EB31796F251CA2D0001E01D3 /* BookBillListModel.h */,
+				EB31796E251CA2D0001E01D3 /* BookBillListModel.m */,
+				EBB588D025208A70005B3988 /* BookProblemModel.h */,
+				EBB588D125208A70005B3988 /* BookProblemModel.m */,
 			);
 			path = Model;
 			sourceTree = "<group>";
@@ -7912,6 +7944,8 @@
 				EB5F44FC2474CCCA008D316D /* BookDetailVC.m */,
 				EB0A738F247B8B8B00DB75CB /* BookBillboardVC.h */,
 				EB0A7390247B8B8B00DB75CB /* BookBillboardVC.m */,
+				EBB8D06F251E00600051C897 /* BookBillBoardSearchVC.h */,
+				EBB8D06E251E00600051C897 /* BookBillBoardSearchVC.m */,
 				EB440027247CB7AE0094C333 /* BookMingDetailVC.h */,
 				EB440028247CB7AE0094C333 /* BookMingDetailVC.m */,
 				EB44002A247D12630094C333 /* BookSubArticeVC.h */,
@@ -8006,6 +8040,9 @@
 				EB0A739F247BC93800DB75CB /* BookBillBookCell.h */,
 				EB0A73A0247BC93800DB75CB /* BookBillBookCell.m */,
 				EB0A73A1247BC93800DB75CB /* BookBillBookCell.xib */,
+				EB317969251C6E00001E01D3 /* BookBillArticeCell.h */,
+				EB317968251C6E00001E01D3 /* BookBillArticeCell.m */,
+				EB31796A251C6E01001E01D3 /* BookBillArticeCell.xib */,
 				EB0A73A4247BC95900DB75CB /* BookBillCousreCell.h */,
 				EB0A73A5247BC95900DB75CB /* BookBillCousreCell.m */,
 				EB0A73A6247BC95900DB75CB /* BookBillCousreCell.xib */,
@@ -8058,6 +8095,9 @@
 				EBBD5E722519D8BD007B174E /* BookListSubCell.h */,
 				EBBD5E732519D8BD007B174E /* BookListSubCell.m */,
 				EBBD5E742519D8BD007B174E /* BookListSubCell.xib */,
+				EB9E202A251F088000311E96 /* BookMingCell.h */,
+				EB9E202B251F088000311E96 /* BookMingCell.m */,
+				EB9E202C251F088000311E96 /* BookMingCell.xib */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -9226,6 +9266,12 @@
 				EBBD5E642519A392007B174E /* BookSearchSubVC.m */,
 				EBBD5E682519CB4E007B174E /* BookLabelAllVC.h */,
 				EBBD5E692519CB4E007B174E /* BookLabelAllVC.m */,
+				EBB8D06B251D818A0051C897 /* BookLabelSearchVC.h */,
+				EBB8D06A251D818A0051C897 /* BookLabelSearchVC.m */,
+				EB9E2031251F0BBA00311E96 /* BookMingSearchVC.h */,
+				EB9E2030251F0BBA00311E96 /* BookMingSearchVC.m */,
+				EBB588CC252064B9005B3988 /* BookGongzhSearchVC.h */,
+				EBB588CD252064B9005B3988 /* BookGongzhSearchVC.m */,
 			);
 			path = BookSearch;
 			sourceTree = "<group>";
@@ -9570,6 +9616,7 @@
 				EB8E2CDB239666A900CDFBDA /* close_gray@3x.png in Resources */,
 				324F176B239B3B4D0025CAE7 /* NoticeSelectCell.xib in Resources */,
 				EBF71753247229FB00ED1838 /* PayBookAlert.xib in Resources */,
+				EB31796C251C6E01001E01D3 /* BookBillArticeCell.xib in Resources */,
 				EBDE08C424582BA6005D426C /* CommonListCell.xib in Resources */,
 				C7D6BC90235DA1CE00770E7C /* MyClubApplicationTableViewCell.xib in Resources */,
 				EB415143246BCD6C00030371 /* BookHomeCell.xib in Resources */,
@@ -9602,6 +9649,7 @@
 				EBC2E147243C70520054E422 /* msg_bg_app@2x.png in Resources */,
 				EB8E2D3E239666A900CDFBDA /* icon_027_cover.png in Resources */,
 				EB2E46FE23A46B5F00CAF0D3 /* TDGroupSearchCell.xib in Resources */,
+				EB9E202E251F088000311E96 /* BookMingCell.xib in Resources */,
 				EB8E2D5A239666A900CDFBDA /* chatbar_map_blue@2x.png in Resources */,
 				EB8E2D72239666A900CDFBDA /* chatbar_face_blue@3x.png in Resources */,
 				C625AAB5236FFFAA0010E967 /* WorkingGroup.storyboard in Resources */,
@@ -10112,6 +10160,7 @@
 				C7037FFC236FD33F008EA3E4 /* SendGroupBCell.m in Sources */,
 				EB820ADC23BC882B00B96C6C /* SearchBaseVC.m in Sources */,
 				C7D6BBA3235DA18A00770E7C /* NSString+CGSize.m in Sources */,
+				EBB8D070251E00600051C897 /* BookBillBoardSearchVC.m in Sources */,
 				C59D0C3523825DE1007D0760 /* NSObject+YYAdd.m in Sources */,
 				EB8E2D0A239666A900CDFBDA /* PSTGridLayoutRow.m in Sources */,
 				C783740323AA31E60096AFE2 /* JoinHistoricalWorkFlowListCell.m in Sources */,
@@ -10238,6 +10287,8 @@
 				EBF7177224725B7A00ED1838 /* BookCardPayAlertCell.m in Sources */,
 				C7974A1F236BFBD0004D5470 /* WorkFLowCell.m in Sources */,
 				C59D0C0C23825DE1007D0760 /* YYAnimatedImageView.m in Sources */,
+				EBB588D225208A70005B3988 /* BookProblemModel.m in Sources */,
+				EB9E202D251F088000311E96 /* BookMingCell.m in Sources */,
 				EBF2D56323C2FB8F00EC35C4 /* MHConstant.m in Sources */,
 				C7D6BCA1235DA1CE00770E7C /* MyDetailTableViewCell.m in Sources */,
 				C59D0C0E23825DE1007D0760 /* NSObject+YYModel.m in Sources */,
@@ -10444,6 +10495,7 @@
 				C69A8E4223754F7A0098FA26 /* ChatSearchFindbyFuJCell.m in Sources */,
 				C625AAAE236FF35B0010E967 /* ChatMsgSearchReseltContentCell.m in Sources */,
 				C7D6BB47235DA18A00770E7C /* CommentSetView.m in Sources */,
+				EB317970251CA2D0001E01D3 /* BookBillListModel.m in Sources */,
 				C59D0C3023825DE1007D0760 /* UIControl+YYAdd.m in Sources */,
 				C708DC0A2371BE36005CC822 /* WorkFlowSearchDetailVC.m in Sources */,
 				C59D0C2423825DE1007D0760 /* UITextField+YYAdd.m in Sources */,
@@ -10514,6 +10566,7 @@
 				EB952693248A560E003EFCCE /* BookReadSearchAlert.m in Sources */,
 				C7974A40236C4CC0004D5470 /* MyWorkWordVC.m in Sources */,
 				C7D6BBB2235DA18A00770E7C /* InfoSearchView.m in Sources */,
+				EB9E2032251F0BBA00311E96 /* BookMingSearchVC.m in Sources */,
 				EB9BBE5023D1BF1A00436A0E /* MailListSearchVC.m in Sources */,
 				EB440036247D15AD0094C333 /* BookSubArticeCell.m in Sources */,
 				C6F2E1D7236D126B009E6903 /* UILabel+GHConfig.m in Sources */,
@@ -10534,6 +10587,7 @@
 				C770405B23AC655700BFF1B0 /* UIView+BYIBInspectable.m in Sources */,
 				EB0A73A2247BC93800DB75CB /* BookBillBookCell.m in Sources */,
 				C7235186238244B20037E4F6 /* ArticleBlocks.m in Sources */,
+				EB31796B251C6E01001E01D3 /* BookBillArticeCell.m in Sources */,
 				EB09BF2D23B1A32B001CCBC7 /* WaitWorkLabelModel.m in Sources */,
 				C7D6BC92235DA1CE00770E7C /* ClubApplicationViewController.m in Sources */,
 				EBE1E2B224947C2800DB80BF /* HomeBigshotCell.m in Sources */,
@@ -10908,6 +10962,7 @@
 				C795C62F23744CD00042300F /* GoDisscussView.m in Sources */,
 				C7D6BC7E235DA1CE00770E7C /* MyOrderViewController.m in Sources */,
 				C59D0C1623825DE1007D0760 /* YYTextLine.m in Sources */,
+				EBB8D06C251D818B0051C897 /* BookLabelSearchVC.m in Sources */,
 				EB6A3D5624A8ADC60067DBFA /* BookHomeSubNumCell.m in Sources */,
 				EBE5EF192459478A00AD59C4 /* CommonToolMoveVC.m in Sources */,
 				EBB6886F23C9C0C300E24DD9 /* MMDraftUtil.m in Sources */,
@@ -10997,6 +11052,7 @@
 				EB8143BD2440502B00C439A9 /* HomeListWorkCell.m in Sources */,
 				C59D0A472382468A007D0760 /* JSONAPI.m in Sources */,
 				C59D0C1423825DE1007D0760 /* YYTextInput.m in Sources */,
+				EBB588CE252064B9005B3988 /* BookGongzhSearchVC.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

binární
smartRhino.xcworkspace/xcuserdata/niuzhen.xcuserdatad/UserInterfaceState.xcuserstate


+ 6 - 144
smartRhino.xcworkspace/xcuserdata/niuzhen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -5,31 +5,9 @@
    version = "2.0">
    <Breakpoints>
       <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.IDEConstraintErrorBreakpoint">
-         <BreakpointContent
-            uuid = "4D5509FC-57ED-4B27-A4EC-6EC7994ED2F8"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            breakpointStackSelectionBehavior = "1">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.ExceptionBreakpoint">
-         <BreakpointContent
-            uuid = "6CF37C8C-C4E1-4F7A-B01F-A11006CECC15"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            breakpointStackSelectionBehavior = "1"
-            scope = "1"
-            stopOnStyle = "0">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.SymbolicBreakpoint">
          <BreakpointContent
-            uuid = "8174DE38-752F-404B-88DD-F92D0A855E38"
+            uuid = "6F0D3D60-12D0-4BF6-87DB-926FA5773BFF"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
@@ -40,131 +18,15 @@
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "C172EFA2-80F6-4EF7-9C9E-5F78AD2EBA93"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "smartRhino/Project/VCModel/common/View/CommonListCell.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "524"
-            endingLineNumber = "524"
-            landmarkName = "-setCellNoAuthorData:withText:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "8D88C257-F3EB-4857-A83D-A302E37CEBA8"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "smartRhino/Project/VCModel/common/View/CommonListCell.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "682"
-            endingLineNumber = "682"
-            landmarkName = "-setCellData:withText:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "3EB0F968-5478-4B5D-8273-FE53B217A6FC"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "smartRhino/Project/VCModel/ChatMessage/Chat/EMChatViewController.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "2875"
-            endingLineNumber = "2875"
-            landmarkName = "-returnMessge"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "A1C7D0AD-ECE7-465C-8CAE-665D636AF2BD"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "smartRhino/Project/VCModel/ChatMessage/Controller/ChatMsgNotice/Controller/MoveViewController.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "462"
-            endingLineNumber = "462"
-            landmarkName = "-collectToFindWithSuperModel:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "2C18A3FE-AA5F-4B35-80AB-FDD2143F45C2"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "smartRhino/Project/VCModel/ChatMessage/Controller/ChatMsgNotice/Controller/MoveViewController.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "104"
-            endingLineNumber = "104"
-            landmarkName = "-viewDidLoad"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "0EC2113C-F5FD-4A54-82D5-819FF0D71099"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "smartRhino/Project/VCModel/Home/OtherHomeVC/MyTDTopic/VC/MyTDTopicDetailVC.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "1906"
-            endingLineNumber = "1906"
-            landmarkName = "-ShareDetail"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "42995D20-6D2F-449E-913B-2F4EFB98083C"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "smartRhino/Project/VCModel/Home/OtherHomeVC/MyTDTopic/VC/MyTDTopicDetailVC.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "1940"
-            endingLineNumber = "1940"
-            landmarkName = "-gotoZanHander"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         BreakpointExtensionID = "Xcode.Breakpoint.ExceptionBreakpoint">
          <BreakpointContent
-            uuid = "8193419F-9824-4381-8122-AB928F6C322C"
+            uuid = "49BF6DED-C2C8-4A59-B04B-ACFB28FD651B"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "smartRhino/Project/VCModel/Home/OtherHomeVC/MyTDTopic/VC/MyTDTopicDetailVC.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "2835"
-            endingLineNumber = "2835"
-            landmarkName = "-userContentController:didReceiveScriptMessage:"
-            landmarkType = "7">
+            breakpointStackSelectionBehavior = "1"
+            scope = "1"
+            stopOnStyle = "0">
          </BreakpointContent>
       </BreakpointProxy>
    </Breakpoints>

+ 13 - 1
smartRhino/AppConfig.h

@@ -202,7 +202,11 @@ return;\
 #define API_APP_Content_Navi_List @"/api/app/page/content-navigation-list"
 #define API_APP_PAGE_Ranking      @"/api/app/page/ranking"
 #define API_APP_PAGE_Star         @"/api/app/page/star"
-#define API_APP_PAGE_Star_page    @"/api/app/page/star-page"
+#define API_APP_PAGE_Attach_List  @"/api/app/page/attach-list"
+#define API_APP_PAGE_Attach       @"/api/app/page/attach/"
+#define API_APP_Media_Attach      @"/api/app/media/attach"
+
+
 
 #define API_APP_PAGE_Navigation_Search    @"/api/app/page/navigation-search"///内容导航筛选
 #define API_APP_PAGE_Channel              @"/api/app/page/channel"
@@ -212,18 +216,26 @@ return;\
 #define API_APP_Media                          @"/api/app/media/"
 #define API_APP_Media_Book                     @"/api/app/media/book/"
 #define API_APP_Media_Book_Content             @"/api/app/media/book/content"
+#define API_APP_Page_Banner_Search             @"/api/app/page/banner-search"
+
+
 
 #define API_APP_Media_Audio                   @"/api/app/media/audio/"
 #define API_APP_Media_Video                   @"/api/app/media/video/"
 #define API_APP_Media_Recommend               @"/api/app/media/recommend"
 #define API_APP_Media_Read                    @"/api/app/media/read/"
 
+#define API_APP_Media_Teacher_Media           @"/api/app/media/teacher-media"
+
+
 #pragma mark - 首页搜索
 #define API_APP_Page_Search                   @"/api/app/page/search"
 #define API_APP_Media_Search                  @"/api/app/media/search"
 #define API_APP_Page_System_Lable_User        @"/api/app/page/system-lable-user"
 #define API_APP_Media_Lable_List              @"/api/web/media/lable-list"
 
+#define API_APP_Page_RangKing_search          @"/api/app/page/rangking-search"
+
 
 #define API_APP_Teacher                       @"/api/app/teacher/"
 #define API_APP_Media_Teacher                 @"/api/app/media/teacher"

+ 22 - 0
smartRhino/Assets.xcassets/comment_star_no.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "comment_star_no@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "comment_star_no@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

binární
smartRhino/Assets.xcassets/comment_star_no.imageset/comment_star_no@2x.png


binární
smartRhino/Assets.xcassets/comment_star_no.imageset/comment_star_no@3x.png


+ 22 - 0
smartRhino/Assets.xcassets/comment_star_yes.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "comment_star_yes@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "comment_star_yes@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

binární
smartRhino/Assets.xcassets/comment_star_yes.imageset/comment_star_yes@2x.png


binární
smartRhino/Assets.xcassets/comment_star_yes.imageset/comment_star_yes@3x.png


+ 22 - 0
smartRhino/Assets.xcassets/comment_unStar.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "comment_unStar@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "comment_unStar@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

binární
smartRhino/Assets.xcassets/comment_unStar.imageset/comment_unStar@2x.png


binární
smartRhino/Assets.xcassets/comment_unStar.imageset/comment_unStar@3x.png


+ 18 - 5
smartRhino/FwzAppConfig.h

@@ -321,10 +321,11 @@ typedef enum CollectModelType{
     CollectModel_NewTopic = -4,
     CollectModel_TopicBooK = 41,
     CollectModel_TopicSubBooK = 42,
+    CollectModel_Ming = 90,
     CollectModel_Aritle = 100,
     CollectModel_MediaAritle = 101,
-    CollectModel_CollectFileAll = 120,
-    CollectModel_NoteFileAll = 130,
+//    CollectModel_CollectFileAll = 120,
+//    CollectModel_NoteFileAll = 130,
     CollectModel_Teacher = 180,
     CollectModel_Organization = 190,
     CollectModel_file = 300,
@@ -338,8 +339,10 @@ typedef enum CollectModelType{
     CollectModel_StoreBook = 20,
     CollectModel_StoreCousre = 30,
     CollectModel_StoreSound = 40,
-    CollectModel_StoreQiKan = 50,
     CollectModel_StoreVideo = 60,
+    CollectModel_StoreMing = 90,
+    CollectModel_StoreGongzh = 110,
+    CollectModel_StoreQiKan = 120,
 }CollectModelType;
  /// 0 新建 1 回复 2 回复全部 3 编辑
 typedef enum MailReplayType{
@@ -448,7 +451,14 @@ typedef enum HistorySearchType {
     HistorySearchType_NoteFolderSearch = 23,
     ///
     HistorySearchType_BookStore = 24,
-
+    ///
+    HistorySearchType_BookLabel = 25,
+    ///
+    HistorySearchType_BookBillBoard = 26,
+    ///
+    HistorySearchType_BookMing = 27,
+    ///
+    HistorySearchType_BookGongZH = 28,
 }HistorySearchType;
 
 /// 书城
@@ -472,8 +482,11 @@ typedef enum MediaType{
     MediaBookType   = 20,  ///书
     MediaCourseType = 30,  ///课程
     MediaMusicType  = 40,  ///音频
-    MediaQikanType  = 50,  ///期刊
+//    MediaQikanType  = 50,  ///期刊
     MediaVideoType  = 60,  ///视频
+    MediaMingType  = 90,   ///名栏
+    MediaGongzhType  = 110,   ///公众号
+    MediaQikanType  = 120,   ///期刊
     MediaArticeType = 100, ///文章
     MediaMediaArticeType = 101, ///文章
 }MediaType;

+ 1 - 0
smartRhino/Project/Other/Third/Calender/NSDate+Extension.h

@@ -37,5 +37,6 @@
 + (NSString *)getCHtimeWihtDate:(NSString *)date;
 + (NSString *)getTimeString:(NSDate *)dt format:(NSString *)fmt;
 ///格式:02-07
++ (NSString *)getDayWihtDate:(NSString *)date;
 + (NSString *)getMonthAndDayWihtDate:(NSString *)date;
 @end

+ 6 - 0
smartRhino/Project/Other/Third/Calender/NSDate+Extension.m

@@ -261,6 +261,12 @@
     }
     return ret;
 }
++ (NSString *)getDayWihtDate:(NSString *)date
+{
+    NSDate * dt = [self getStringDate:date format:@"yyyy-MM-dd HH:mm:ss"];
+    NSString * ret = [self getTimeString:dt format:@"MM-dd"];
+    return ret;
+}
 + (NSString *)getMonthAndDayWihtDate:(NSString *)date
 {
     NSDate * dt = [self getStringDate:date format:@"yyyy-MM-dd HH:mm:ss"];

+ 1 - 0
smartRhino/Project/VCModel/ChatMessage/Controller/ChatMsgNotice/Controller/MoveViewController.m

@@ -492,6 +492,7 @@
                 || [vc isKindOfClass:NSClassFromString(@"CommonHomeVC")]
                 || [vc isKindOfClass:NSClassFromString(@"MyTDTopicBookVC")]
                 || [vc isKindOfClass:NSClassFromString(@"MyTDTopicDetailVC")]
+                || [vc isKindOfClass:NSClassFromString(@"BookMingDetailVC")]
                 || [vc isKindOfClass:NSClassFromString(@"HomeSCDetailVC")]                
                 || [vc isKindOfClass:NSClassFromString(@"NoteBookVC")]) {
                 [self.navigationController popToViewController:vc animated:YES];

+ 8 - 10
smartRhino/Project/VCModel/ChatMessage/Controller/MailList/Controller/MailChatVC.m

@@ -407,11 +407,10 @@
     NSMutableArray * mailArray = [NSMutableArray arrayWithArray:USERDEFAULTSGET(MAILSELECT)];
     for (id detail in sssArray) {
         SelectModel * ssmodel = [self addSelectModel:detail];
-        
         __block BOOL isEque = NO;
         [mailArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
-            SelectModel * sModel = (SelectModel*) [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)obj];
-            if (sModel.SourceType == ssmodel.SourceType && sModel.SourceId == ssmodel.SourceId && sModel.TypeValue == ssmodel.TypeValue) {
+            SelectModel * sModel = [SelectModel modelWithDictionary:(NSDictionary *)obj];
+            if (sModel.SourceType == ssmodel.SourceType && sModel.SourceId == ssmodel.SourceId) {
                 isEque = YES;
                 if (!ssmodel.hadSelected) {
                     [mailArray removeObject:obj];
@@ -419,8 +418,7 @@
             }
         }];
         if (!isEque && ssmodel.hadSelected) {
-            NSData * ssdata  = [NSKeyedArchiver archivedDataWithRootObject:ssmodel];
-            [mailArray addObject:ssdata];
+            [mailArray addObject:@{@"SourceType":@(ssmodel.SourceType),@"SourceId":@(ssmodel.SourceId),@"SourceTypeValue":@(ssmodel.TypeValue),@"SourceName":ssmodel.SourceName}];
         }
         USERDEFAULTSSET(mailArray, MAILSELECT);
     }
@@ -484,11 +482,11 @@
     NSMutableDictionary * paraDict = [NSMutableDictionary dictionary];
     NSMutableArray * mArray = [NSMutableArray array];
     NSMutableArray * selectArray = [NSMutableArray array];
-    [mailArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
-        SelectModel * sModel = (SelectModel*) [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)obj];
-        [chaoArray addObject:sModel];
-        [mArray addObject:@{@"SourceType":@(sModel.SourceType),@"SourceId":@(sModel.SourceId),@"SourceTypeValue":@(sModel.TypeValue),@"SourceName":sModel.SourceName}];
-    }];
+    for (NSDictionary * dict in mailArray) {
+        SelectModel * model = [SelectModel modelWithDictionary:dict];
+        [chaoArray addObject:model];
+        [mArray addObject:@{@"SourceType":@(model.SourceType),@"SourceId":@(model.SourceId),@"SourceTypeValue":@(model.TypeValue),@"SourceName":model.SourceName}];
+    }
     if (self.IsSelectDes) {
         [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFI_ChaoSongRen object:nil userInfo:@{@"selectPeople":chaoArray}];
         [self back1];

+ 8 - 10
smartRhino/Project/VCModel/ChatMessage/Controller/MailList/Controller/MailGroupListVC.m

@@ -321,11 +321,10 @@
     NSMutableArray * mailArray = [NSMutableArray arrayWithArray:USERDEFAULTSGET(MAILSELECT)];
     for (id detail in sssArray) {
         SelectModel * ssmodel = [self addSelectModel:detail];
-        
         __block BOOL isEque = NO;
         [mailArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
-            SelectModel * sModel = (SelectModel*) [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)obj];
-            if (sModel.SourceType == ssmodel.SourceType && sModel.SourceId == ssmodel.SourceId && sModel.TypeValue == ssmodel.TypeValue) {
+            SelectModel * sModel = [SelectModel modelWithDictionary:(NSDictionary *)obj];
+            if (sModel.SourceType == ssmodel.SourceType && sModel.SourceId == ssmodel.SourceId) {
                 isEque = YES;
                 if (!ssmodel.hadSelected) {
                     [mailArray removeObject:obj];
@@ -333,8 +332,7 @@
             }
         }];
         if (!isEque && ssmodel.hadSelected) {
-            NSData * ssdata  = [NSKeyedArchiver archivedDataWithRootObject:ssmodel];
-            [mailArray addObject:ssdata];
+            [mailArray addObject:@{@"SourceType":@(ssmodel.SourceType),@"SourceId":@(ssmodel.SourceId),@"SourceTypeValue":@(ssmodel.TypeValue),@"SourceName":ssmodel.SourceName}];
         }
         USERDEFAULTSSET(mailArray, MAILSELECT);
     }
@@ -388,11 +386,11 @@
     NSMutableDictionary * paraDict = [NSMutableDictionary dictionary];
     NSMutableArray * mArray = [NSMutableArray array];
     NSMutableArray * selectArray = [NSMutableArray array];
-    [mailArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
-        SelectModel * sModel = (SelectModel*) [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)obj];
-        [chaoArray addObject:sModel];
-        [mArray addObject:@{@"SourceType":@(sModel.SourceType),@"SourceId":@(sModel.SourceId),@"SourceTypeValue":@(sModel.TypeValue),@"SourceName":sModel.SourceName}];
-    }];
+    for (NSDictionary * dict in mailArray) {
+        SelectModel * model = [SelectModel modelWithDictionary:dict];
+        [chaoArray addObject:model];
+        [mArray addObject:@{@"SourceType":@(model.SourceType),@"SourceId":@(model.SourceId),@"SourceTypeValue":@(model.TypeValue),@"SourceName":model.SourceName}];
+    }
     if (self.IsSelectDes) {
         [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFI_ChaoSongRen object:nil userInfo:@{@"selectPeople":chaoArray}];
         [self back1];

+ 9 - 10
smartRhino/Project/VCModel/ChatMessage/Controller/MailList/Controller/MailGroupVC.m

@@ -692,16 +692,16 @@
     self.selectCountL.text = [NSString stringWithFormat:@"%ld",count];
     [self.tableView reloadData];
 }
+
 - (void)countMailArray:(NSArray *)sssArray
 {
     NSMutableArray * mailArray = [NSMutableArray arrayWithArray:USERDEFAULTSGET(MAILSELECT)];
     for (id detail in sssArray) {
         SelectModel * ssmodel = [self addSelectModel:detail];
-        
         __block BOOL isEque = NO;
         [mailArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
-            SelectModel * sModel = (SelectModel*) [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)obj];
-            if (sModel.SourceType == ssmodel.SourceType && sModel.SourceId == ssmodel.SourceId && sModel.TypeValue == ssmodel.TypeValue) {
+            SelectModel * sModel = [SelectModel modelWithDictionary:(NSDictionary *)obj];
+            if (sModel.SourceType == ssmodel.SourceType && sModel.SourceId == ssmodel.SourceId) {
                 isEque = YES;
                 if (!ssmodel.hadSelected) {
                     [mailArray removeObject:obj];
@@ -709,8 +709,7 @@
             }
         }];
         if (!isEque && ssmodel.hadSelected) {
-            NSData * ssdata  = [NSKeyedArchiver archivedDataWithRootObject:ssmodel];
-            [mailArray addObject:ssdata];
+            [mailArray addObject:@{@"SourceType":@(ssmodel.SourceType),@"SourceId":@(ssmodel.SourceId),@"SourceTypeValue":@(ssmodel.TypeValue),@"SourceName":ssmodel.SourceName}];
         }
         USERDEFAULTSSET(mailArray, MAILSELECT);
     }
@@ -784,11 +783,11 @@
     NSMutableDictionary * paraDict = [NSMutableDictionary dictionary];
     NSMutableArray * mArray = [NSMutableArray array];
     NSMutableArray * selectArray = [NSMutableArray array];
-    [mailArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
-        SelectModel * sModel = (SelectModel*) [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)obj];
-        [chaoArray addObject:sModel];
-        [mArray addObject:@{@"SourceType":@(sModel.SourceType),@"SourceId":@(sModel.SourceId),@"SourceTypeValue":@(sModel.TypeValue),@"SourceName":sModel.SourceName}];
-    }];
+    for (NSDictionary * dict in mailArray) {
+        SelectModel * model = [SelectModel modelWithDictionary:dict];
+        [chaoArray addObject:model];
+        [mArray addObject:@{@"SourceType":@(model.SourceType),@"SourceId":@(model.SourceId),@"SourceTypeValue":@(model.TypeValue),@"SourceName":model.SourceName}];
+    }
     if (self.IsSelectDes) {
         [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFI_ChaoSongRen object:nil userInfo:@{@"selectPeople":chaoArray}];
         [self back1];

+ 72 - 68
smartRhino/Project/VCModel/ChatMessage/Controller/MyTDGroup/Cell/TDGroupInfoListCell.xib

@@ -1,10 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16097.3" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17156" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17125"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
@@ -36,8 +37,8 @@
                         <nil key="highlightedColor"/>
                     </label>
                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="事件聚焦" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wvS-i5-ZvJ">
-                        <rect key="frame" x="16" y="64" width="288" height="102"/>
-                        <fontDescription key="fontDescription" name="PingFangSC-Regular" family="PingFang SC" pointSize="18"/>
+                        <rect key="frame" x="16" y="64" width="288" height="100.5"/>
+                        <fontDescription key="fontDescription" name="PingFangSC-Regular" family="PingFang SC" pointSize="19"/>
                         <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                         <nil key="highlightedColor"/>
                     </label>
@@ -97,7 +98,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstAttribute="trailing" secondItem="luc-11-UcF" secondAttribute="trailing" id="3Rq-Sk-9OA"/>
                             <constraint firstAttribute="height" constant="50" id="62F-gd-H5I"/>
@@ -107,12 +108,12 @@
                         </constraints>
                     </view>
                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="252" usesAttributedText="YES" lineBreakMode="tailTruncation" numberOfLines="5" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rST-d4-AER">
-                        <rect key="frame" x="16" y="173.5" width="288" height="22.5"/>
+                        <rect key="frame" x="16" y="172" width="288" height="24"/>
                         <attributedString key="attributedText">
                             <fragment content="事件聚焦">
                                 <attributes>
                                     <color key="NSColor" red="0.28235294119999998" green="0.28235294119999998" blue="0.28235294119999998" alpha="1" colorSpace="calibratedRGB"/>
-                                    <font key="NSFont" size="16" name="PingFangSC-Regular"/>
+                                    <font key="NSFont" size="17" name="PingFangSC-Regular"/>
                                     <paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" lineSpacing="5" tighteningFactorForTruncation="0.0"/>
                                 </attributes>
                             </fragment>
@@ -125,7 +126,7 @@
                             <constraint firstAttribute="width" constant="7.5" id="yC0-VI-mau"/>
                         </constraints>
                     </imageView>
-                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="FYe-vd-3Sn">
+                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="FYe-vd-3Sn">
                         <rect key="frame" x="267.5" y="8.5" width="30" height="27"/>
                         <fontDescription key="fontDescription" type="system" pointSize="12"/>
                         <state key="normal" title="公开">
@@ -207,18 +208,18 @@
                         <nil key="highlightedColor"/>
                     </label>
                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="事件聚焦" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FX3-2q-6Qs">
-                        <rect key="frame" x="16" y="64" width="288" height="163.5"/>
-                        <fontDescription key="fontDescription" name="PingFangSC-Regular" family="PingFang SC" pointSize="20"/>
+                        <rect key="frame" x="16" y="64" width="288" height="162"/>
+                        <fontDescription key="fontDescription" name="PingFangSC-Regular" family="PingFang SC" pointSize="21"/>
                         <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                         <nil key="highlightedColor"/>
                     </label>
                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" numberOfLines="5" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sSZ-rA-BBY">
-                        <rect key="frame" x="15" y="237.5" width="290" height="22.5"/>
+                        <rect key="frame" x="15" y="236" width="290" height="24"/>
                         <attributedString key="attributedText">
                             <fragment content="事件聚焦">
                                 <attributes>
                                     <color key="NSColor" red="0.28235294119999998" green="0.28235294119999998" blue="0.28235294119999998" alpha="1" colorSpace="calibratedRGB"/>
-                                    <font key="NSFont" size="16" name="PingFangSC-Regular"/>
+                                    <font key="NSFont" size="17" name="PingFangSC-Regular"/>
                                     <paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" lineSpacing="5" tighteningFactorForTruncation="0.0"/>
                                 </attributes>
                             </fragment>
@@ -261,7 +262,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="142" height="142"/>
                                             </imageView>
                                         </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                         <constraints>
                                             <constraint firstItem="bY5-lK-O0Y" firstAttribute="leading" secondItem="lkK-RM-7CI" secondAttribute="leading" id="5dR-14-qHq"/>
                                             <constraint firstItem="bY5-lK-O0Y" firstAttribute="top" secondItem="lkK-RM-7CI" secondAttribute="top" id="H4V-Ay-nrN"/>
@@ -272,7 +273,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstItem="0UI-11-M0a" firstAttribute="leading" secondItem="mwS-If-ehC" secondAttribute="leading" id="03N-6Y-Ljq"/>
                             <constraint firstAttribute="width" secondItem="mwS-If-ehC" secondAttribute="height" multiplier="145:71" id="AOE-ar-UWK"/>
@@ -320,7 +321,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstAttribute="trailing" secondItem="vbw-7C-syZ" secondAttribute="trailing" id="9pL-Mb-vvC"/>
                             <constraint firstItem="vbw-7C-syZ" firstAttribute="leading" secondItem="pYF-9Q-C54" secondAttribute="leading" id="Bh7-X8-ibJ"/>
@@ -336,7 +337,7 @@
                             <constraint firstAttribute="width" constant="7.5" id="Zrj-Or-eY6"/>
                         </constraints>
                     </imageView>
-                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="j3B-4c-R3J">
+                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="j3B-4c-R3J">
                         <rect key="frame" x="267.5" y="8.5" width="30" height="27"/>
                         <fontDescription key="fontDescription" type="system" pointSize="12"/>
                         <state key="normal" title="公开">
@@ -424,18 +425,18 @@
                         <nil key="highlightedColor"/>
                     </label>
                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="事件聚焦" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="MjR-4O-nf5">
-                        <rect key="frame" x="16" y="64" width="288" height="211.5"/>
-                        <fontDescription key="fontDescription" name="PingFangSC-Regular" family="PingFang SC" pointSize="20"/>
+                        <rect key="frame" x="16" y="64" width="288" height="210"/>
+                        <fontDescription key="fontDescription" name="PingFangSC-Regular" family="PingFang SC" pointSize="19"/>
                         <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                         <nil key="highlightedColor"/>
                     </label>
                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" numberOfLines="5" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GAV-kW-lry">
-                        <rect key="frame" x="15" y="283" width="290" height="22.5"/>
+                        <rect key="frame" x="15" y="281.5" width="290" height="24"/>
                         <attributedString key="attributedText">
                             <fragment content="事件聚焦">
                                 <attributes>
                                     <color key="NSColor" red="0.28235294119999998" green="0.28235294119999998" blue="0.28235294119999998" alpha="1" colorSpace="calibratedRGB"/>
-                                    <font key="NSFont" size="16" name="PingFangSC-Regular"/>
+                                    <font key="NSFont" size="17" name="PingFangSC-Regular"/>
                                     <paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" lineSpacing="5" tighteningFactorForTruncation="0.0"/>
                                 </attributes>
                             </fragment>
@@ -478,7 +479,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="94" height="94"/>
                                             </imageView>
                                         </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                         <constraints>
                                             <constraint firstAttribute="bottom" secondItem="Eme-9G-Aq3" secondAttribute="bottom" id="Haj-D0-Wor"/>
                                             <constraint firstAttribute="trailing" secondItem="Eme-9G-Aq3" secondAttribute="trailing" id="MGE-ZR-Y3n"/>
@@ -493,7 +494,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="94" height="94"/>
                                             </imageView>
                                         </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                         <constraints>
                                             <constraint firstItem="BZT-KW-pYU" firstAttribute="leading" secondItem="qtV-PN-EZQ" secondAttribute="leading" id="Buj-IX-xPM"/>
                                             <constraint firstAttribute="trailing" secondItem="BZT-KW-pYU" secondAttribute="trailing" id="C4H-7X-ODs"/>
@@ -504,7 +505,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstAttribute="width" secondItem="KjD-wX-x6e" secondAttribute="height" multiplier="145:47" id="0pO-gk-t6J"/>
                             <constraint firstItem="hWf-2F-pam" firstAttribute="top" secondItem="KjD-wX-x6e" secondAttribute="top" id="D5R-6Y-Vde"/>
@@ -552,7 +553,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstItem="mXL-Ec-zru" firstAttribute="top" secondItem="O5c-BO-Xkk" secondAttribute="top" id="NDO-mC-AJi"/>
                             <constraint firstItem="mXL-Ec-zru" firstAttribute="leading" secondItem="O5c-BO-Xkk" secondAttribute="leading" id="k1l-gB-4vk"/>
@@ -567,7 +568,7 @@
                             <constraint firstAttribute="width" constant="7.5" id="ZKF-li-dz5"/>
                         </constraints>
                     </imageView>
-                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="FRn-Y9-BCv">
+                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="FRn-Y9-BCv">
                         <rect key="frame" x="267.5" y="8.5" width="30" height="27"/>
                         <fontDescription key="fontDescription" type="system" pointSize="12"/>
                         <state key="normal" title="公开">
@@ -656,18 +657,18 @@
                         <nil key="highlightedColor"/>
                     </label>
                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="事件聚焦" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DfP-II-xeF">
-                        <rect key="frame" x="16" y="64" width="288" height="235.5"/>
-                        <fontDescription key="fontDescription" name="PingFangSC-Regular" family="PingFang SC" pointSize="20"/>
+                        <rect key="frame" x="16" y="64" width="288" height="234"/>
+                        <fontDescription key="fontDescription" name="PingFangSC-Regular" family="PingFang SC" pointSize="19"/>
                         <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                         <nil key="highlightedColor"/>
                     </label>
                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" numberOfLines="5" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fmW-j5-FST">
-                        <rect key="frame" x="15" y="307" width="290" height="22.5"/>
+                        <rect key="frame" x="15" y="305.5" width="290" height="24"/>
                         <attributedString key="attributedText">
                             <fragment content="事件聚焦">
                                 <attributes>
                                     <color key="NSColor" red="0.28235294119999998" green="0.28235294119999998" blue="0.28235294119999998" alpha="1" colorSpace="calibratedRGB"/>
-                                    <font key="NSFont" size="16" name="PingFangSC-Regular"/>
+                                    <font key="NSFont" size="17" name="PingFangSC-Regular"/>
                                     <paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" lineSpacing="5" tighteningFactorForTruncation="0.0"/>
                                 </attributes>
                             </fragment>
@@ -710,7 +711,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="142" height="142"/>
                                             </imageView>
                                         </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                         <constraints>
                                             <constraint firstAttribute="trailing" secondItem="7hg-1x-py0" secondAttribute="trailing" id="ZK4-qF-e88"/>
                                             <constraint firstItem="7hg-1x-py0" firstAttribute="top" secondItem="NKn-YM-Wm7" secondAttribute="top" id="cbn-4U-RjK"/>
@@ -721,7 +722,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstItem="09x-10-78g" firstAttribute="top" secondItem="vEn-wM-Qzz" secondAttribute="top" id="Hiu-Lh-KAN"/>
                             <constraint firstAttribute="trailing" secondItem="09x-10-78g" secondAttribute="trailing" id="NH8-Yw-FcO"/>
@@ -749,7 +750,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="142" height="142"/>
                                             </imageView>
                                         </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                         <constraints>
                                             <constraint firstItem="uXf-bg-WFP" firstAttribute="leading" secondItem="Acm-Zk-AEU" secondAttribute="leading" id="K4a-ed-cQo"/>
                                             <constraint firstAttribute="bottom" secondItem="uXf-bg-WFP" secondAttribute="bottom" id="Nr9-NI-Ufn"/>
@@ -760,7 +761,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstItem="hnt-9N-MyT" firstAttribute="top" secondItem="0mB-V0-imz" secondAttribute="top" id="3qG-WF-i3E"/>
                             <constraint firstAttribute="width" secondItem="0mB-V0-imz" secondAttribute="height" multiplier="145:71" id="6I3-5f-mq9"/>
@@ -808,7 +809,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstAttribute="height" constant="50" id="07o-cD-78Q"/>
                             <constraint firstItem="YAD-JK-z9d" firstAttribute="top" secondItem="UAA-aV-pvd" secondAttribute="top" id="0eV-S6-0ze"/>
@@ -823,7 +824,7 @@
                             <constraint firstAttribute="width" constant="7.5" id="MQU-9e-dts"/>
                         </constraints>
                     </imageView>
-                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="IE1-DM-fbI">
+                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="IE1-DM-fbI">
                         <rect key="frame" x="267.5" y="8.5" width="30" height="27"/>
                         <fontDescription key="fontDescription" type="system" pointSize="12"/>
                         <state key="normal" title="公开">
@@ -916,18 +917,18 @@
                         <nil key="highlightedColor"/>
                     </label>
                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="事件聚焦" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yVA-qq-0Qg">
-                        <rect key="frame" x="16" y="64" width="288" height="113.5"/>
-                        <fontDescription key="fontDescription" name="PingFangSC-Regular" family="PingFang SC" pointSize="20"/>
+                        <rect key="frame" x="16" y="64" width="288" height="112"/>
+                        <fontDescription key="fontDescription" name="PingFangSC-Regular" family="PingFang SC" pointSize="19"/>
                         <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                         <nil key="highlightedColor"/>
                     </label>
                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" numberOfLines="5" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lac-4x-BqW">
-                        <rect key="frame" x="15" y="185" width="290" height="22.5"/>
+                        <rect key="frame" x="15" y="183.5" width="290" height="24"/>
                         <attributedString key="attributedText">
                             <fragment content="事件聚焦">
                                 <attributes>
                                     <color key="NSColor" red="0.28235294119999998" green="0.28235294119999998" blue="0.28235294119999998" alpha="1" colorSpace="calibratedRGB"/>
-                                    <font key="NSFont" size="16" name="PingFangSC-Regular"/>
+                                    <font key="NSFont" size="17" name="PingFangSC-Regular"/>
                                     <paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" lineSpacing="5" tighteningFactorForTruncation="0.0"/>
                                 </attributes>
                             </fragment>
@@ -970,7 +971,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="94" height="94"/>
                                             </imageView>
                                         </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                         <constraints>
                                             <constraint firstItem="6xP-NZ-RhI" firstAttribute="top" secondItem="won-ep-NnI" secondAttribute="top" id="7wA-5P-2Mj"/>
                                             <constraint firstAttribute="bottom" secondItem="6xP-NZ-RhI" secondAttribute="bottom" id="eaW-Pb-y56"/>
@@ -985,7 +986,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="94" height="94"/>
                                             </imageView>
                                         </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                         <constraints>
                                             <constraint firstItem="uue-3R-YPL" firstAttribute="top" secondItem="PMR-eU-J8E" secondAttribute="top" id="9HM-2e-hHL"/>
                                             <constraint firstItem="uue-3R-YPL" firstAttribute="leading" secondItem="PMR-eU-J8E" secondAttribute="leading" id="a2w-U3-bSc"/>
@@ -996,7 +997,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstItem="nob-F9-lo1" firstAttribute="top" secondItem="IIN-Og-HhA" secondAttribute="top" id="95j-FB-luo"/>
                             <constraint firstAttribute="trailing" secondItem="nob-F9-lo1" secondAttribute="trailing" id="Bis-J3-YNg"/>
@@ -1024,7 +1025,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="94" height="94"/>
                                             </imageView>
                                         </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                         <constraints>
                                             <constraint firstItem="o5l-eH-jDh" firstAttribute="top" secondItem="kV3-r2-mjd" secondAttribute="top" id="DgE-YY-hoz"/>
                                             <constraint firstAttribute="trailing" secondItem="o5l-eH-jDh" secondAttribute="trailing" id="O9G-sX-Dsh"/>
@@ -1039,7 +1040,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="94" height="94"/>
                                             </imageView>
                                         </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                         <constraints>
                                             <constraint firstItem="wSq-eI-jl9" firstAttribute="top" secondItem="M1D-dw-5dK" secondAttribute="top" id="5Em-tQ-Kg4"/>
                                             <constraint firstItem="wSq-eI-jl9" firstAttribute="leading" secondItem="M1D-dw-5dK" secondAttribute="leading" id="V3I-5Z-rC3"/>
@@ -1050,7 +1051,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstAttribute="bottom" secondItem="zRI-de-EdT" secondAttribute="bottom" id="34s-Rl-ASJ"/>
                             <constraint firstAttribute="trailing" secondItem="zRI-de-EdT" secondAttribute="trailing" id="CxS-lG-9oJ"/>
@@ -1097,7 +1098,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstItem="UXc-0h-DXR" firstAttribute="top" secondItem="CLu-mv-eIB" secondAttribute="top" id="MO5-mp-Qeq"/>
                             <constraint firstAttribute="trailing" secondItem="UXc-0h-DXR" secondAttribute="trailing" id="O6I-r4-MAo"/>
@@ -1112,7 +1113,7 @@
                             <constraint firstAttribute="width" constant="7.5" id="VQL-W0-Eun"/>
                         </constraints>
                     </imageView>
-                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Bd0-kJ-IXn">
+                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Bd0-kJ-IXn">
                         <rect key="frame" x="267.5" y="8.5" width="30" height="27"/>
                         <fontDescription key="fontDescription" type="system" pointSize="12"/>
                         <state key="normal" title="公开">
@@ -1208,18 +1209,18 @@
                         <nil key="highlightedColor"/>
                     </label>
                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="事件聚焦" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="AWh-Mg-KC4">
-                        <rect key="frame" x="16" y="64" width="288" height="75.5"/>
-                        <fontDescription key="fontDescription" name="PingFangSC-Regular" family="PingFang SC" pointSize="20"/>
+                        <rect key="frame" x="16" y="64" width="288" height="74"/>
+                        <fontDescription key="fontDescription" name="PingFangSC-Regular" family="PingFang SC" pointSize="19"/>
                         <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                         <nil key="highlightedColor"/>
                     </label>
                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" numberOfLines="5" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tZS-dh-NWX">
-                        <rect key="frame" x="15" y="147" width="290" height="22.5"/>
+                        <rect key="frame" x="15" y="145.5" width="290" height="24"/>
                         <attributedString key="attributedText">
                             <fragment content="事件聚焦">
                                 <attributes>
                                     <color key="NSColor" red="0.28235294119999998" green="0.28235294119999998" blue="0.28235294119999998" alpha="1" colorSpace="calibratedRGB"/>
-                                    <font key="NSFont" size="16" name="PingFangSC-Regular"/>
+                                    <font key="NSFont" size="17" name="PingFangSC-Regular"/>
                                     <paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" lineSpacing="5" tighteningFactorForTruncation="0.0"/>
                                 </attributes>
                             </fragment>
@@ -1262,7 +1263,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="94" height="94"/>
                                             </imageView>
                                         </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                         <constraints>
                                             <constraint firstAttribute="trailing" secondItem="4fO-Q0-NT6" secondAttribute="trailing" id="6ed-R8-egk"/>
                                             <constraint firstItem="4fO-Q0-NT6" firstAttribute="leading" secondItem="R7b-QF-M7L" secondAttribute="leading" id="PB3-Af-vy3"/>
@@ -1277,7 +1278,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="94" height="94"/>
                                             </imageView>
                                         </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                         <constraints>
                                             <constraint firstAttribute="bottom" secondItem="aVf-3T-JX8" secondAttribute="bottom" id="Zwf-lN-tik"/>
                                             <constraint firstItem="aVf-3T-JX8" firstAttribute="leading" secondItem="Uim-31-YAP" secondAttribute="leading" id="bqn-KP-DtD"/>
@@ -1288,7 +1289,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstAttribute="trailing" secondItem="4ZU-w1-TuL" secondAttribute="trailing" id="0Qb-HR-T0B"/>
                             <constraint firstItem="4ZU-w1-TuL" firstAttribute="top" secondItem="OVq-4M-8kc" secondAttribute="top" id="BiX-td-BB3"/>
@@ -1316,7 +1317,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="94" height="94"/>
                                             </imageView>
                                         </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                         <constraints>
                                             <constraint firstItem="LFT-Op-ozq" firstAttribute="leading" secondItem="mQe-Aa-W73" secondAttribute="leading" id="AmR-0q-vud"/>
                                             <constraint firstAttribute="bottom" secondItem="LFT-Op-ozq" secondAttribute="bottom" id="Uyc-b9-KCK"/>
@@ -1331,7 +1332,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="94" height="94"/>
                                             </imageView>
                                         </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                         <constraints>
                                             <constraint firstItem="zLV-fp-jqb" firstAttribute="top" secondItem="r11-xZ-30P" secondAttribute="top" id="5C3-93-vmn"/>
                                             <constraint firstAttribute="bottom" secondItem="zLV-fp-jqb" secondAttribute="bottom" id="QHa-55-OTf"/>
@@ -1342,7 +1343,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstItem="Qst-3e-X7I" firstAttribute="leading" secondItem="rp0-Z5-1vz" secondAttribute="leading" id="42b-qE-yYk"/>
                             <constraint firstItem="Qst-3e-X7I" firstAttribute="top" secondItem="rp0-Z5-1vz" secondAttribute="top" id="6M3-ct-Ose"/>
@@ -1369,7 +1370,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="94" height="94"/>
                                             </imageView>
                                         </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                         <constraints>
                                             <constraint firstAttribute="trailing" secondItem="sef-lr-NGO" secondAttribute="trailing" id="KJW-Tx-6KN"/>
                                             <constraint firstAttribute="bottom" secondItem="sef-lr-NGO" secondAttribute="bottom" id="X4M-aJ-aoG"/>
@@ -1384,7 +1385,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="94" height="94"/>
                                             </imageView>
                                         </subviews>
-                                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                         <constraints>
                                             <constraint firstItem="HND-Ji-Nd3" firstAttribute="top" secondItem="ThA-8k-nfU" secondAttribute="top" id="NES-DV-Pz9"/>
                                             <constraint firstAttribute="trailing" secondItem="HND-Ji-Nd3" secondAttribute="trailing" id="eDq-O5-2ul"/>
@@ -1395,7 +1396,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstAttribute="trailing" secondItem="fPE-co-CXk" secondAttribute="trailing" id="CQM-Y2-4eb"/>
                             <constraint firstItem="fPE-co-CXk" firstAttribute="top" secondItem="3dx-0n-ZgX" secondAttribute="top" id="DqD-DZ-f0i"/>
@@ -1442,7 +1443,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstAttribute="bottom" secondItem="gz0-SZ-5xe" secondAttribute="bottom" id="Kch-5f-H4F"/>
                             <constraint firstItem="gz0-SZ-5xe" firstAttribute="leading" secondItem="fJT-AZ-AHo" secondAttribute="leading" id="R4h-UT-Qv2"/>
@@ -1454,7 +1455,7 @@
                     <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="chatmsg_rightArrow_icon" translatesAutoresizingMaskIntoConstraints="NO" id="Kdn-Oa-Jfq">
                         <rect key="frame" x="298.5" y="16" width="6.5" height="12"/>
                     </imageView>
-                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="vMG-bH-iqR">
+                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="vMG-bH-iqR">
                         <rect key="frame" x="268.5" y="8.5" width="30" height="27"/>
                         <fontDescription key="fontDescription" type="system" pointSize="12"/>
                         <state key="normal" title="公开">
@@ -1557,18 +1558,18 @@
                         <nil key="highlightedColor"/>
                     </label>
                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="事件聚焦" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lrt-Ub-Des">
-                        <rect key="frame" x="16" y="64" width="288" height="230.5"/>
-                        <fontDescription key="fontDescription" name="PingFangSC-Regular" family="PingFang SC" pointSize="20"/>
+                        <rect key="frame" x="16" y="64" width="288" height="229"/>
+                        <fontDescription key="fontDescription" name="PingFangSC-Regular" family="PingFang SC" pointSize="19"/>
                         <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                         <nil key="highlightedColor"/>
                     </label>
                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" numberOfLines="5" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="apK-kR-8ve">
-                        <rect key="frame" x="15" y="304.5" width="290" height="22.5"/>
+                        <rect key="frame" x="15" y="303" width="290" height="24"/>
                         <attributedString key="attributedText">
                             <fragment content="事件聚焦">
                                 <attributes>
                                     <color key="NSColor" red="0.28235294119999998" green="0.28235294119999998" blue="0.28235294119999998" alpha="1" colorSpace="calibratedRGB"/>
-                                    <font key="NSFont" size="16" name="PingFangSC-Regular"/>
+                                    <font key="NSFont" size="17" name="PingFangSC-Regular"/>
                                     <paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" lineSpacing="5" tighteningFactorForTruncation="0.0"/>
                                 </attributes>
                             </fragment>
@@ -1650,7 +1651,7 @@
                                 </subviews>
                             </stackView>
                         </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstItem="OA5-qQ-Uk7" firstAttribute="leading" secondItem="lI1-M0-QCh" secondAttribute="leading" id="6vG-Dr-Fdw"/>
                             <constraint firstAttribute="trailing" secondItem="OA5-qQ-Uk7" secondAttribute="trailing" id="8Cc-yy-JAp"/>
@@ -1666,7 +1667,7 @@
                             <constraint firstAttribute="width" constant="7.5" id="N43-5L-RQ8"/>
                         </constraints>
                     </imageView>
-                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sSg-EX-b87">
+                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sSg-EX-b87">
                         <rect key="frame" x="267.5" y="8.5" width="30" height="27"/>
                         <fontDescription key="fontDescription" type="system" pointSize="12"/>
                         <state key="normal" title="公开">
@@ -1733,5 +1734,8 @@
         <image name="收藏_评论" width="18" height="18"/>
         <image name="收藏_赞" width="18" height="18"/>
         <image name="收藏_转发" width="18" height="18"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
     </resources>
 </document>

+ 3 - 0
smartRhino/Project/VCModel/Home/Model/HomeSubItemModel.h

@@ -20,11 +20,14 @@ NS_ASSUME_NONNULL_BEGIN
 @property (nonatomic, copy) NSString     *ExtendLableName;
 @property (nonatomic, assign) BOOL        IsCollect;
 @property (nonatomic, copy) NSString     *Author;
+@property (nonatomic, copy) NSString     *AutoNumber;
+@property (nonatomic, assign) NSInteger   CommentScore;
 @property (nonatomic, copy) NSString     *Name;
 @property (nonatomic, copy) NSString     *CreatedDate;
 @property (nonatomic, copy) NSString     *Duration;
 @property (nonatomic, copy) NSString     *Summary;
 @property (nonatomic, copy) NSString     *Press;
+@property (nonatomic, copy) NSString     *Job;
 @property (nonatomic, assign) NSInteger   PressId;
 @property (nonatomic, copy) NSString     *VideoImage;
 @property (nonatomic, copy) NSString     *VideoCoverImage;

+ 15 - 4
smartRhino/Project/VCModel/Home/VC/BookStore/BookDetail.storyboard

@@ -1194,39 +1194,50 @@
                                 </connections>
                             </view>
                             <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="84N-jF-zwg">
-                                <rect key="frame" x="0.0" y="64" width="414" height="672"/>
+                                <rect key="frame" x="0.0" y="114" width="414" height="622"/>
                                 <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                 <connections>
                                     <outlet property="dataSource" destination="643-tT-fv4" id="NfY-JF-m3J"/>
                                     <outlet property="delegate" destination="643-tT-fv4" id="74K-JE-EsE"/>
                                 </connections>
                             </tableView>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FW0-dZ-d0A">
+                                <rect key="frame" x="0.0" y="64" width="414" height="50"/>
+                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="50" id="Fbe-PW-UWf"/>
+                                </constraints>
+                            </view>
                         </subviews>
                         <viewLayoutGuide key="safeArea" id="5K8-2M-phM"/>
                         <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
+                            <constraint firstItem="5K8-2M-phM" firstAttribute="trailing" secondItem="FW0-dZ-d0A" secondAttribute="trailing" id="Hg4-Ml-Wte"/>
+                            <constraint firstItem="FW0-dZ-d0A" firstAttribute="top" secondItem="Exw-kL-upX" secondAttribute="bottom" id="MxD-tl-ofQ"/>
                             <constraint firstItem="Exw-kL-upX" firstAttribute="trailing" secondItem="5K8-2M-phM" secondAttribute="trailing" id="NtJ-a9-bEp"/>
+                            <constraint firstItem="84N-jF-zwg" firstAttribute="top" secondItem="FW0-dZ-d0A" secondAttribute="bottom" id="Rys-58-npx"/>
                             <constraint firstItem="Exw-kL-upX" firstAttribute="leading" secondItem="5K8-2M-phM" secondAttribute="leading" id="cZl-zo-V7Y"/>
+                            <constraint firstItem="FW0-dZ-d0A" firstAttribute="leading" secondItem="5K8-2M-phM" secondAttribute="leading" id="l86-wL-l67"/>
                             <constraint firstItem="Exw-kL-upX" firstAttribute="top" secondItem="OzT-3h-z6B" secondAttribute="top" id="m35-uA-0ol"/>
                             <constraint firstItem="84N-jF-zwg" firstAttribute="leading" secondItem="5K8-2M-phM" secondAttribute="leading" id="nLM-z3-Q8s"/>
-                            <constraint firstItem="84N-jF-zwg" firstAttribute="top" secondItem="Exw-kL-upX" secondAttribute="bottom" id="qzp-Ik-F4e"/>
                             <constraint firstItem="5K8-2M-phM" firstAttribute="bottom" secondItem="84N-jF-zwg" secondAttribute="bottom" id="sNN-bW-hVr"/>
                             <constraint firstItem="5K8-2M-phM" firstAttribute="trailing" secondItem="84N-jF-zwg" secondAttribute="trailing" id="x7h-vJ-xUo"/>
                         </constraints>
                     </view>
                     <navigationItem key="navigationItem" id="bIy-n3-4gY"/>
                     <connections>
+                        <outlet property="searchView" destination="FW0-dZ-d0A" id="prV-3L-O8c"/>
                         <outlet property="tableView" destination="84N-jF-zwg" id="EQe-ql-Zlw"/>
                         <outlet property="titleL" destination="AFQ-Bq-JGa" id="j2a-O2-BsZ"/>
                     </connections>
                 </viewController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="TKV-Ab-NxB" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
             </objects>
-            <point key="canvasLocation" x="-968" y="789"/>
+            <point key="canvasLocation" x="-968.11594202898561" y="788.31521739130437"/>
         </scene>
     </scenes>
     <resources>
-        <image name="Book_Search_Icon" width="16" height="15"/>
+        <image name="Book_Search_Icon" width="17" height="16"/>
         <image name="Book_listen_downNext_Icon" width="25" height="25"/>
         <image name="Book_listen_huatong_Icon" width="25" height="25"/>
         <image name="Book_listen_leftTime_Icon" width="25" height="25"/>

+ 21 - 0
smartRhino/Project/VCModel/Home/VC/BookStore/Model/BookBillListModel.h

@@ -0,0 +1,21 @@
+//
+//  BookBillListModel.h
+//  smartRhino
+//
+//  Created by niuzhen on 2020/6/4.
+//  Copyright © 2020 tederen. All rights reserved.
+//
+
+#import "BaseModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface BookBillListModel : BaseModel
+@property (nonatomic, copy) NSString             * LabelName;
+@property (nonatomic, assign) NSInteger            Id;
+@property (nonatomic, assign) NSInteger            LableType;
+@property (nonatomic, assign) NSInteger            StyleType;
+@property (nonatomic, assign) NSInteger            ResourceType;
+@end
+
+NS_ASSUME_NONNULL_END

+ 13 - 0
smartRhino/Project/VCModel/Home/VC/BookStore/Model/BookBillListModel.m

@@ -0,0 +1,13 @@
+//
+//  BookBillListModel.m
+//  smartRhino
+//
+//  Created by niuzhen on 2020/6/4.
+//  Copyright © 2020 tederen. All rights reserved.
+//
+
+#import "BookBillListModel.h"
+
+@implementation BookBillListModel
+
+@end

+ 1 - 1
smartRhino/Project/VCModel/Home/VC/BookStore/Model/BookListenModel.h

@@ -23,7 +23,7 @@ NS_ASSUME_NONNULL_BEGIN
 @property (nonatomic,copy) NSString *        Summary;
 @property (nonatomic,copy) NSString *        Name;
 @property (nonatomic,copy) NSString *        Title;
-
+@property (nonatomic,copy) NSString *        Job;
 @property (nonatomic,assign) NSInteger       CollectCount;
 @property (nonatomic,assign) NSInteger       CommentCount;
 @property (nonatomic,assign) NSInteger       PraiseCount;

+ 16 - 2
smartRhino/Project/VCModel/Home/VC/BookStore/Model/BookMeidaModel.h

@@ -12,7 +12,9 @@ NS_ASSUME_NONNULL_BEGIN
 
 @interface BookMeidaModel : BaseModel
 @property (nonatomic,copy) NSString *        Title;
+@property (nonatomic,copy) NSString *        Name;
 @property (nonatomic,copy) NSString *        ImageUrls;
+@property (nonatomic,copy) NSString *        ImageUrl;
 @property (nonatomic,copy) NSString *        Summary;
 @property (nonatomic,copy) NSString *        Author;
 @property (nonatomic,copy) NSString *        Source;
@@ -20,17 +22,29 @@ NS_ASSUME_NONNULL_BEGIN
 @property (nonatomic,copy) NSString *        AddDate;
 @property (nonatomic,copy) NSString *        Press;
 @property (nonatomic,copy) NSString *        PublishTime;
+@property (nonatomic,strong) NSArray*        BookCatalogResults;
+@property (nonatomic,strong) NSArray*        PraisePagedList;
+
 @property (nonatomic,assign) NSInteger       Id;
-@property (nonatomic,assign) NSInteger       MediaType;
+@property (nonatomic,assign) MediaType       MediaType;
 @property (nonatomic,assign) NSInteger       CollectCount;
 @property (nonatomic,assign) NSInteger       RetransmissionCount;
 @property (nonatomic,assign) NSInteger       CommentCount;
 @property (nonatomic,assign) NSInteger       ReadCount;
+@property (nonatomic,assign) NSInteger       PraiseCount;
+@property (nonatomic,assign) NSInteger       ResourceCount;
+
 @property (nonatomic,assign) CGFloat         IosDiscountPrice;
 @property (nonatomic,assign) CGFloat         IosPrice;
+@property (nonatomic,assign) CGFloat         OtherDiscountPrice;
+@property (nonatomic,assign) CGFloat         OtherPrice;
 @property (nonatomic,assign) CGFloat         CommentScore;
-@property (nonatomic,assign) BOOL            IsRecommend;
 @property (nonatomic,assign) BOOL            IsBuy;
+@property (nonatomic,assign) BOOL            IsCollect;
+@property (nonatomic,assign) BOOL            IsPraise;
+@property (nonatomic,assign) BOOL            IsRecommend;
+@property (nonatomic,assign) BOOL            IsRetransmission;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 21 - 0
smartRhino/Project/VCModel/Home/VC/BookStore/Model/BookProblemModel.h

@@ -0,0 +1,21 @@
+//
+//  BookProblemModel.h
+//  smartRhino
+//
+//  Created by niuzhen on 2020/6/4.
+//  Copyright © 2020 tederen. All rights reserved.
+//
+
+#import "BaseModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface BookProblemModel : BaseModel
+@property (nonatomic, copy) NSString             * Title;
+@property (nonatomic, copy) NSArray              * ImageUrls;
+@property (nonatomic, copy) NSString             * Blocks;
+@property (nonatomic, assign) NSInteger            Id;
+@property (nonatomic, assign) MediaType            MediaType;
+@end
+
+NS_ASSUME_NONNULL_END

+ 13 - 0
smartRhino/Project/VCModel/Home/VC/BookStore/Model/BookProblemModel.m

@@ -0,0 +1,13 @@
+//
+//  BookProblemModel.m
+//  smartRhino
+//
+//  Created by niuzhen on 2020/6/4.
+//  Copyright © 2020 tederen. All rights reserved.
+//
+
+#import "BookProblemModel.h"
+
+@implementation BookProblemModel
+
+@end

+ 0 - 1
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookAllLookVC.h

@@ -13,7 +13,6 @@ NS_ASSUME_NONNULL_BEGIN
 @interface BookAllLookVC : BaseViewController
 @property (nonatomic, copy) NSString     * titleStr;
 @property (nonatomic, assign) NSInteger    Id;
-@property (nonatomic, assign) BOOL         noSearch;
 +(BookAllLookVC *)initBookAllLookVC;
 @end
 

+ 28 - 46
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookAllLookVC.m

@@ -8,31 +8,10 @@
 
 #import "BookAllLookVC.h"
 #import "MyTDGroupView.h"
-#import "ChatMsgListCell.h"
-#import "ChatMsgCollectionCell.h"
-#import "TDGroupInfoListModel.h"
-#import "TDGroupInfoListCell.h"
-#import "NoteBookVC.h"
-#import "OtherNoteBookVC.h"
-#import "MailListDetailVC.h"
-#import "MyFavoriteVC.h"
-#import "MyTDGroupViewController.h"
-#import "MoveViewController.h"
-#import "OtherFavoriteVC.h"
-#import "TDGroupInfoListVC.h"
-#import "WorkFlowDetailsController.h"
-#import "MyApprovalPageDetail.h"
-#import "DownFileViewController.h"
-#import "ShareListVC.h"
-#import "TDInterLeterHomeViewController.h"
-#import "MyTDTopicViewController.h"
-#import "MailListVC.h"
-#import "WaitWorkVC.h"
-#import "MyTDTopicSearchVC.h"
-#import "SourceGroupVC.h"
-#import "ChatMsgListVC.h"
-#import "BookAllLookCell.h"
 #import "HomeSubItemModel.h"
+#import "BookMingSearchVC.h"
+#import "BookMingDetailVC.h"
+#import "BookAllLookCell.h"
 
 @interface BookAllLookVC ()<UICollectionViewDelegate,UICollectionViewDataSource>
 @property (weak, nonatomic) IBOutlet UICollectionView *collectionView;
@@ -114,21 +93,27 @@
         make.left.right.mas_equalTo(self.HeadView);
         make.height.mas_offset(36);
     }];
-    if (self.noSearch) {
-        self.HeadView.hidden = YES;
-        self.height.constant = 0.f;
-    }else{
-        self.LineV.hidden = YES;
-    }
+//    if (self.noSearch) {
+//        self.HeadView.hidden = YES;
+//        self.height.constant = 0.f;
+//    }else{
+//        self.LineV.hidden = YES;
+//    }
+    WS(weakSelf);
+    [self.SearchView.button setAction:^{
+        BookMingSearchVC * vc = [[BookMingSearchVC alloc] init];
+        vc.Id = weakSelf.Id;
+        [weakSelf.navigationController pushViewController:vc animated:YES];
+    }];
+    self.LineV.hidden = YES;
     [self.collectionView registerNib:[UINib nibWithNibName:@"BookAllLookCell" bundle:nil] forCellWithReuseIdentifier:@"BookAllLookCell"];
     self.TitleL.text = self.titleStr;
-    [self getData];
+    [self headRefresh];
 }
 - (void)getData
 {
     WS(weakSelf);
-    [self.dataArray removeAllObjects];
-    [[HttpManager sharedHttpManager] POSTUrl:Host(API_APP_PAGE_Star_page) parameters:@{@"Id":[NSNumber numberWithInteger:self.Id],@"page":@(self.currentPage),@"PerPage":@20} responseStyle:JOSN success:^(id  _Nonnull responseObject) {
+    [[HttpManager sharedHttpManager] POSTUrl:Host(API_APP_PAGE_Attach_List) parameters:@{@"LableId":@(self.Id),@"page":@(self.currentPage),@"PerPage":@20} responseStyle:JOSN success:^(id  _Nonnull responseObject) {
         NSLog(@"%@",responseObject);
         if ([responseObject isKindOfClass:[NSDictionary class]]) {
             for (NSDictionary * dict in responseObject[@"Items"]) {
@@ -146,18 +131,6 @@
         
     }];
 }
-//- (void)setDataModel
-//{
-//    [self.dataArray removeAllObjects];
-//    for (NSInteger i = 0; i < 12; i ++) {
-//        BookHomeSubModel * subModel = [[BookHomeSubModel alloc] init];
-//        subModel.title = @"意识形态研究";
-//        subModel.name = @"实施乡村振兴战略,要坚持党管农村工 作,坚持农业农村优先发展";
-//        subModel.type = BookHomeE;
-//        subModel.subtitle = @"我们看重的是教给学生多少知识。在教育者眼中,学生就是一个装知识的容器,那个时候教育的成…";
-//        [self.dataArray addObject:subModel];
-//    }
-//}
 
 - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section
 {
@@ -180,7 +153,6 @@
     return CGSizeMake(SCREEN_WIDTH, 120);
 }
 
-
 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
 {
     BookAllLookCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"BookAllLookCell" forIndexPath:indexPath];
@@ -188,4 +160,14 @@
     [cell setDataWithModel:model];
     return cell;
 }
+- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
+{
+    HomeSubItemModel * model = [self.dataArray objectAtIndex:indexPath.item];
+    [collectionView deselectItemAtIndexPath:indexPath animated:YES];
+    BookMingDetailVC * vc = [BookMingDetailVC initBookMingDetailVC];
+    vc.gzId = model.Id;
+    vc.type = model.MediaType;
+    vc.titleStr = model.Title;
+    [self.navigationController pushViewController:vc animated:YES];
+}
 @end

+ 17 - 0
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookBillBoardSearchVC.h

@@ -0,0 +1,17 @@
+//
+//  BookBillBoardSearchVC.h
+//  smartRhino
+//
+//  Created by niuzhen on 2020/2/26.
+//  Copyright © 2020 tederen. All rights reserved.
+//
+
+#import "SearchBaseVC.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface BookBillBoardSearchVC : SearchBaseVC
+@property (nonatomic,assign) NSInteger  Id;
+@end
+
+NS_ASSUME_NONNULL_END

+ 236 - 0
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookBillBoardSearchVC.m

@@ -0,0 +1,236 @@
+//
+//  BookBillBoardSearchVC.m
+//  smartRhino
+//
+//  Created by niuzhen on 2020/2/26.
+//  Copyright © 2020 tederen. All rights reserved.
+//
+
+#import "BookBillBoardSearchVC.h"
+#import "HomeWeiCousreCell.h"
+#import "BookSubArticeCell.h"
+#import "HomeTeacherCell.h"
+#import "HomeMusicCell.h"
+#import "HomeSchoolCell.h"
+#import "IndexGoodBookCell.h"
+#import "HomeSubItemModel.h"
+#import "BookTeacherDetailVC.h"
+#import "BookWCDetailVC.h"
+#import "BookListenVC.h"
+#import "BookListDetailVC.h"
+
+@interface BookBillBoardSearchVC ()<UITableViewDelegate,UITableViewDataSource>
+@property (nonatomic, assign) NSUInteger  currentPage;
+@property (nonatomic, assign) NSUInteger  Total;
+@property (nonatomic, strong) NSMutableArray  *dataArray;
+
+@end
+
+@implementation BookBillBoardSearchVC
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    self.fd_prefersNavigationBarHidden = YES;
+    self.view.backgroundColor = RGB(255, 255, 255);
+    self.tableView.delegate = self;
+    self.tableView.dataSource = self;
+    self.historySearchType = HistorySearchType_BookBillBoard;
+    [self addObserver:self forKeyPath:@"searchText" options:NSKeyValueObservingOptionNew context:nil];
+}
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
+{
+    id obj = [change objectForKey:@"new"];
+    NSString * text = @"";
+    if ([obj isKindOfClass:[NSString class]]) {
+        text = obj;
+    }else{
+        text  = [obj stringValue];
+    }
+    if (text.length > 0) {
+        [self headRefresh];
+    }
+}
+- (NSMutableArray *)dataArray
+{
+    if (!_dataArray) {
+        _dataArray = [NSMutableArray array];
+    }
+    return _dataArray;
+}
+#pragma mark - UItableView刷新
+- (void)setTableViewRefresh{
+    WeakSelf(self)
+    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
+        [weakself headRefresh];
+    }];
+    self.tableView.mj_footer = [MJRefreshBackStateFooter footerWithRefreshingBlock:^{
+        [weakself footerRefresh];
+    }];
+    [self.tableView.mj_header beginRefreshing];
+}
+
+- (void)headRefresh{
+    self.currentPage = 1;
+    self.Total = 0;
+    [self.dataArray removeAllObjects];
+    [self getData];
+    [self.tableView.mj_header endRefreshing];
+}
+
+- (void)footerRefresh{
+    self.currentPage += 1;
+    if (self.Total == self.dataArray.count) {
+        self.currentPage --;
+        [self.tableView.mj_footer resetNoMoreData];
+        return;
+    }
+    [self.tableView.mj_footer endRefreshing];
+}
+- (void)getData
+{
+    WS(weakSelf);
+    SHOWLOADING
+    NSDictionary * paraDict = @{@"Page":@(self.currentPage),
+                                @"PerPage":@(10),
+                                @"KeyWord":self.searchText
+    };
+    [[HttpManager sharedHttpManager] POSTUrl:Host(API_APP_Page_RangKing_search) parameters:paraDict responseStyle:JOSN success:^(id  _Nonnull responseObject) {
+        REMOVESHOW
+        NSLog(@"%@",responseObject);
+        if ([responseObject isKindOfClass:[NSDictionary class]]) {
+            for (NSDictionary * dict in responseObject[@"Items"]) {
+                HomeSubItemModel * model = [HomeSubItemModel modelWithDictionary:dict];
+                [weakSelf.dataArray addObject:model];
+            }
+        }
+        weakSelf.Total = [responseObject[@"Total"] integerValue];
+        [weakSelf.tableView.mj_footer endRefreshing];
+        dispatch_async(dispatch_get_main_queue(), ^{
+            [weakSelf.tableView reloadData];
+        });
+    } failure:^(NSError * _Nonnull error) {
+        REMOVESHOW
+    }];
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
+{
+    return self.dataArray.count;
+}
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    HomeSubItemModel * model = [self.dataArray objectAtIndex:indexPath.row];
+    switch ((CollectModelType)model.MediaType) {
+        case CollectModel_StoreBook:
+        {
+            IndexGoodBookCell * cell = [IndexGoodBookCell configCell0:tableView indexPath:indexPath];
+            [cell setDataWithModel:model searchText:self.searchText];
+//            if (self.dataArray.count == indexPath.row + 1) {
+//                cell.lineV.hidden = YES;
+//            }
+            return cell;
+        }
+            break;
+        case CollectModel_StoreVideo:
+        {
+            HomeWeiCousreCell * cell = [HomeWeiCousreCell configCell0:tableView indexPath:indexPath];
+            [cell setDataWithIndexModel:model searchText:self.searchText];
+//            if (self.dataArray.count == indexPath.row + 1) {
+//                cell.lineV.hidden = YES;
+//            }
+            return cell;
+        }
+            break;
+        case CollectModel_StoreSound:
+        {
+            HomeMusicCell * cell = [HomeMusicCell configCell:tableView indexPath:indexPath];
+            [cell setDataWithModel:model searchText:self.searchText];
+//            if (self.dataArray.count == indexPath.row + 1) {
+//                cell.lineV.hidden = YES;
+//            }
+            return cell;
+        }
+            break;
+        case CollectModel_Teacher:
+        {
+            HomeTeacherCell * cell = [HomeTeacherCell configCell:tableView indexPath:indexPath];
+            [cell setDataWithModel:model searchText:self.searchText];
+//            if (self.dataArray.count == indexPath.row + 1) {
+//                cell.lineV.hidden = YES;
+//            }
+            return cell;
+        }
+            break;
+        case CollectModel_Organization:
+        {
+            HomeSchoolCell * cell = [HomeSchoolCell configCell1:tableView indexPath:indexPath];
+            [cell setDataIndexModel:model searchText:self.searchText];
+//            if (self.dataArray.count == indexPath.row + 1) {
+//                cell.lineV.hidden = YES;
+//            }
+            return cell;
+        }
+            break;
+        default:
+        {
+            IndexGoodBookCell * cell = [IndexGoodBookCell configCell0:tableView indexPath:indexPath];
+            [cell setDataWithModel:model searchText:self.searchText];
+//            if (self.dataArray.count == indexPath.row + 1) {
+//                cell.lineV.hidden = YES;
+//            }
+            return cell;
+        }
+            break;
+    }
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    HomeSubItemModel * model = [self.dataArray objectAtIndex:indexPath.row];
+    [tableView deselectRowAtIndexPath:indexPath animated:YES];
+    switch ((CollectModelType)model.MediaType) {
+        case CollectModel_StoreBook:
+        {
+            BookListDetailVC * vc = [BookListDetailVC initBookListDetailVC];
+            vc.Id = model.Id;
+            [self.navigationController pushViewController:vc animated:YES];
+        }
+            break;
+        case CollectModel_StoreVideo:
+        {
+            BookWCDetailVC * vc = [BookWCDetailVC initBookWCDetailVC];
+            vc.Id = model.Id;
+            [self.navigationController pushViewController:vc animated:YES];
+        }
+            break;
+        case CollectModel_StoreSound:
+        {
+            BookListenVC * vc = [BookListenVC initBookListenVC];
+            vc.Id = model.Id;
+            vc.MediaType = MediaMusicType;
+            [self.navigationController pushViewController:vc animated:YES];
+        }
+            break;
+        case CollectModel_Teacher:
+        {
+            BookTeacherDetailVC * vc = [BookTeacherDetailVC initBookTeacherDetailVC];
+            vc.Id = model.Id;
+            [self.navigationController pushViewController:vc animated:YES];
+        }
+            break;
+        case CollectModel_Organization:
+        {
+            
+        }
+            break;
+        default:
+        {
+            MyTDTopicDetailVC * vc = [MyTDTopicDetailVC initMyTDTopicDetailVC];
+            vc.type = (CollectModelType)model.MediaType;
+            vc.Id = model.Id;
+            [self.navigationController pushViewController:vc animated:YES];
+        }
+            break;
+    }
+}
+@end

+ 121 - 28
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookBillboardVC.m

@@ -14,6 +14,14 @@
 #import "BookAllLookVC.h"
 #import "BookHotSearchVC.h"
 #import "HomeSubModel.h"
+#import "HomeSubItemModel.h"
+#import "BookBillListModel.h"
+#import "BookTeacherDetailVC.h"
+#import "BookWCDetailVC.h"
+#import "BookListenVC.h"
+#import "BookListDetailVC.h"
+#import "BookLabelAllVC.h"
+#import "BookBillBoardSearchVC.h"
 
 @interface BookBillboardVC ()<UITableViewDelegate,UITableViewDataSource>
 @property (weak, nonatomic) IBOutlet UIView *HeadView;
@@ -21,6 +29,7 @@
 @property (weak, nonatomic) IBOutlet UITableView *tableView;
 @property (strong, nonatomic) MyTDGroupView      *SearchView;
 @property (strong, nonatomic) NSMutableArray     *dataArray;
+@property (strong, nonatomic) NSMutableArray     *listArray;
 @end
 
 @implementation BookBillboardVC
@@ -42,9 +51,18 @@
     }
     return _dataArray;
 }
+- (NSMutableArray *)listArray
+{
+    if (!_listArray) {
+        _listArray = [NSMutableArray array];
+    }
+    return _listArray;
+}
+
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.fd_prefersNavigationBarHidden = YES;
+    self.tableView.contentInsetAdjustmentBehavior = NO;
     self.tableView.delegate = self;
     self.tableView.dataSource = self;
     [self.HeadView addSubview:self.SearchView];
@@ -53,19 +71,37 @@
         make.left.right.mas_equalTo(self.HeadView);
         make.height.mas_offset(36);
     }];
-    [self addViewWithButton];
-//    [self setArray];
+    WS(weakSelf);
+    [self.SearchView.button setAction:^{
+        BookBillBoardSearchVC * vc = [[BookBillBoardSearchVC alloc] init];
+        [weakSelf.navigationController pushViewController:vc animated:YES];
+    }];
     [self getData];
 }
 - (void)addViewWithButton
 {
-    NSArray * array = @[@[@"热搜榜",@"热书榜",@"课程榜",@"Top 100 新书"],@[@"文献头条",@"视听榜",@"大众热评",@"Top 100 专著"]];
-    CGFloat W = (SCREEN_WIDTH - 100) / 18;
+//    NSArray * array = @[@[@"热搜榜",@"热书榜",@"课程榜",@"Top 100 新书"],@[@"文献头条",@"视听榜",@"大众热评",@"Top 100 专著"]];
+    
+    NSMutableArray * array = [NSMutableArray array];
+    NSMutableArray * subArray = [NSMutableArray array];
+    for (NSInteger i = 0; i < self.listArray.count; i ++) {
+        [subArray addObject:self.listArray[i]];
+        if ((i + 1) % 4 == 0) {
+            [array addObject:subArray];
+            subArray = [NSMutableArray array];
+            continue;
+        }
+        if ((self.listArray.count - 1) == i && ((i + 1) % 4 ) !=0) {
+            [array addObject:subArray];
+        }
+    }
+    CGFloat W = (SCREEN_WIDTH - 80) / 18;
     for (NSInteger i = 0; i < array.count; i ++) {
         NSArray * subarray = array[i];
         for (NSInteger j = 0; j < [subarray count]; j ++) {
+            BookBillListModel * model = subarray[j];
             UIButton * btn = [UIButton new];
-            [btn setTitle:subarray[j] forState:UIControlStateNormal];
+            [btn setTitle:model.LabelName forState:UIControlStateNormal];
             [btn setTitleColor:UIColorHex(0x0A0A0A) forState:UIControlStateNormal];
             btn.titleLabel.font = [UIFont systemFontOfSize:14];
             btn.tag = i * 4 + j;
@@ -83,20 +119,20 @@
                         break;
                     case 1:
                     {
-                        make.size.mas_offset(CGSizeMake(W * 3, 33));
-                        make.left.mas_offset(j * 25 + 25 + W * 4);
+                        make.size.mas_offset(CGSizeMake(W * 4, 33));
+                        make.left.mas_offset(j * 25 + 25 + W * 3);
                     }
                         break;
                     case 2:
                     {
                         make.size.mas_offset(CGSizeMake(W * 4, 33));
-                        make.left.mas_offset(j * 25 + 25 + W * 7);
+                        make.left.mas_offset(j * 25 + 25 + W * 6);
                     }
                         break;
                     default:
                     {
-                        make.size.mas_offset(CGSizeMake(W * 7, 33));
-                        make.left.mas_offset(j * 25 + 25 + W * 11);
+                        make.size.mas_offset(CGSizeMake(W * 6, 33));
+                        make.left.mas_offset(j * 25 + 25 + W * 9);
                     }
                         break;
                 }
@@ -107,16 +143,28 @@
 - (void)getData
 {
     [self.dataArray removeAllObjects];
+    [self.listArray removeAllObjects];
     WS(weakSelf);
     [[HttpManager sharedHttpManager] GETUrl:Host(API_APP_PAGE_Ranking) parameters:@{} responseStyle:JOSN success:^(id  _Nonnull responseObject) {
         NSLog(@"%@",responseObject);
-        if ([responseObject isKindOfClass:[NSArray class]]) {
-            for (NSDictionary * dict in responseObject) {
+        if ([responseObject isKindOfClass:[NSDictionary class]]) {
+            for (NSDictionary * dict in responseObject[@"Labels"]) {
+                BookBillListModel * model = [BookBillListModel modelWithDictionary:dict];
+                [weakSelf.listArray addObject:model];
+            }
+            for (NSDictionary * dict in responseObject[@"Items"]) {
                 HomeSubModel * model = [HomeSubModel modelWithDictionary:dict];
+                NSMutableArray * array = [NSMutableArray array];
+                for (NSDictionary * subDict in model.Items) {
+                    HomeSubItemModel * smodel = [HomeSubItemModel modelWithDictionary:subDict];
+                    [array addObject:smodel];
+                }
+                model.Items = array.mutableCopy;
                 [weakSelf.dataArray addObject:model];
             }
         }
         dispatch_async(dispatch_get_main_queue(), ^{
+            [weakSelf addViewWithButton];
             [weakSelf.tableView reloadData];
         });
     } failure:^(NSError * _Nonnull error) {
@@ -125,18 +173,8 @@
 }
 - (void)clickBtnAction:(UIButton *)sender
 {
-    NSLog(@"%ld",sender.tag);
-    switch (sender.tag) {
-        case 0:
-        {
-            BookHotSearchVC * vc = [BookHotSearchVC initBookHotSearchVC];
-            [self.navigationController pushViewController:vc animated:YES];
-        }
-            break;
-            
-        default:
-            break;
-    }
+    BookBillListModel * model = [self.listArray objectAtIndex:sender.tag];
+    [self ShowAll:model.Id name:model.LabelName];
 }
 //- (void)setArray
 //{
@@ -170,11 +208,66 @@
     [cell setDataWithModel:model Item:indexPath.row];
     WS(weakSelf);
     [cell.lookAllBtn setAction:^{
-        BookAllLookVC * vc = [BookAllLookVC initBookAllLookVC];
-        vc.titleStr = model.Name;
-        vc.noSearch = YES;
-        [weakSelf.navigationController pushViewController:vc animated:YES];
+        [weakSelf ShowAll:model.Id name:model.Name];
     }];
+    cell.ClickItemBlock = ^(HomeSubItemModel * _Nonnull smodel) {
+        [weakSelf pushVC:smodel];
+    };
     return cell;
 }
+- (void)pushVC:(HomeSubItemModel *)model
+{
+    switch ((CollectModelType)model.MediaType) {
+        case CollectModel_StoreBook:
+        {
+            BookListDetailVC * vc = [BookListDetailVC initBookListDetailVC];
+            vc.Id = model.Id;
+            [self.navigationController pushViewController:vc animated:YES];
+        }
+            break;
+        case CollectModel_StoreVideo:
+        {
+            BookWCDetailVC * vc = [BookWCDetailVC initBookWCDetailVC];
+            vc.Id = model.Id;
+            [self.navigationController pushViewController:vc animated:YES];
+        }
+            break;
+        case CollectModel_StoreSound:
+        {
+            BookListenVC * vc = [BookListenVC initBookListenVC];
+            vc.Id = model.Id;
+            vc.MediaType = MediaMusicType;
+            [self.navigationController pushViewController:vc animated:YES];
+        }
+            break;
+        case CollectModel_Teacher:
+        {
+            BookTeacherDetailVC * vc = [BookTeacherDetailVC initBookTeacherDetailVC];
+            vc.Id = model.Id;
+            [self.navigationController pushViewController:vc animated:YES];
+        }
+            break;
+        case CollectModel_Organization:
+        {
+
+        }
+            break;
+        default:
+        {
+            MyTDTopicDetailVC * vc = [MyTDTopicDetailVC initMyTDTopicDetailVC];
+            vc.type = (CollectModelType)model.MediaType;
+            vc.Id = model.Id;
+            [self.navigationController pushViewController:vc animated:YES];
+        }
+            break;
+    }
+}
+
+- (void)ShowAll:(NSInteger)Id name:(NSString *)name
+{
+    BookLabelAllVC * vc = [BookLabelAllVC initBookLabelAllVC];
+    vc.Id = Id;
+    vc.titleStr = name;
+    [self.navigationController pushViewController:vc animated:YES];
+}
 @end

+ 83 - 40
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookContentNavVC.m

@@ -39,7 +39,6 @@
 #import "BookContentTopCell.h"
 #import "BookSelectCell.h"
 #import "BookSelectModel.h"
-#import "MOFSPickerManager.h"
 #import "BookNavModel.h"
 #import "HomeSubItemModel.h"
 #import "BookSelectSubModel.h"
@@ -54,6 +53,7 @@
 #import "HomeMusicCell.h"
 #import "HomeSchoolCell.h"
 #import "IndexGoodBookCell.h"
+#import <BRPickerView.h>
 
 @interface BookContentNavVC ()<UITableViewDelegate,UITableViewDataSource,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
 @property (weak, nonatomic) IBOutlet UITableView *leftTableV;
@@ -88,6 +88,9 @@
 @property (assign, nonatomic) NSInteger             categropId;
 @property (assign, nonatomic) NSInteger             currentPage;
 @property (assign, nonatomic) NSInteger             Total;
+@property (strong, nonatomic) NSArray               *teacherArray;
+@property (strong, nonatomic) NSArray               *pressArray;
+
 @end
 
 @implementation BookContentNavVC
@@ -257,7 +260,7 @@
            } failure:^(NSError * _Nonnull error) {
                
            }];
-           [[HttpManager sharedHttpManager] POSTUrl:Host(API_APP_Content_Navi_List) parameters:@{@"page":@(self.currentPage),@"PerPage":@(20),@"CategoryId":[NSNumber numberWithInteger:0]} responseStyle:JOSN success:^(id  _Nonnull responseObject) {
+           [[HttpManager sharedHttpManager] POSTUrl:Host(API_APP_Content_Navi_List) parameters:@{@"page":@(self.currentPage),@"PerPage":@(20),@"CategoryId":[NSNumber numberWithInteger:0],@"IsApp":@(YES)} responseStyle:JOSN success:^(id  _Nonnull responseObject) {
                NSLog(@"++++%@",responseObject);
                if ([responseObject isKindOfClass:[NSDictionary class]]) {
                    for (NSDictionary * dict in responseObject[@"Items"]) {
@@ -310,8 +313,18 @@
 - (void)getRightData
 {
     WS(weakSelf);
-    [self.listArray removeAllObjects];
-    [[HttpManager sharedHttpManager] POSTUrl:Host(API_APP_Content_Navi_List) parameters:@{@"page":@(self.currentPage),@"PerPage":@(20),@"CategoryId":@(self.categropId),@"sort":@(self.type)} responseStyle:JOSN success:^(id  _Nonnull responseObject) {
+    NSDictionary * paraDict = @{@"CategoryId":@(self.categropId),
+                                @"BeginTime":self.beginTime,
+                                @"EndTime":self.endTime,
+                                @"Sort":@(self.type),
+                                @"TeacherId":self.teacherArray,
+                                @"Unit":@[],
+                                @"Press":self.pressArray,
+                                @"IsApp":@(YES),
+                                @"page":@(self.currentPage),
+                                @"PerPage":@(20)
+    };
+    [[HttpManager sharedHttpManager] POSTUrl:Host(API_APP_Content_Navi_List) parameters:paraDict responseStyle:JOSN success:^(id  _Nonnull responseObject) {
         NSLog(@"++++%@",responseObject);
         if ([responseObject isKindOfClass:[NSDictionary class]]) {
             if ([responseObject[@"Items"] isKindOfClass:[NSArray class]]) {
@@ -320,6 +333,10 @@
                     [weakSelf.listArray addObject:model];
                 }
                 weakSelf.Total = [responseObject[@"Total"] integerValue];
+                if (weakSelf.Total == weakSelf.listArray.count) {
+                    [weakSelf.rightTableV.mj_footer endRefreshingWithNoMoreData];
+                    weakSelf.rightTableV.mj_footer.hidden = YES;
+                }
             }
         }
         [weakSelf.rightTableV.mj_header endRefreshing];
@@ -768,6 +785,10 @@
         }
             break;
     }
+    self.beginTime = @"";
+    self.endTime = @"";
+    self.teacherArray = @[];
+    self.pressArray = @[];
     [self headRefresh];
     [self.collectionView reloadData];
     WS(weakSelf);
@@ -894,12 +915,13 @@
         }
         [self.selectArray addObject:model];
     }
-    [self.selectTableV reloadData];
+    WS(weakSelf);
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        [weakSelf.selectTableV reloadData];
+    });
 }
 - (void)upDataSelect:(BOOL)select
 {
-    WS(weakSelf);
-    [weakSelf.listArray removeAllObjects];
     NSDictionary * paraDict;
     if (!select) {
         paraDict = @{@"CategoryId":[NSNumber numberWithInteger:0],
@@ -945,30 +967,11 @@
                     break;
             }
         }
-        paraDict = @{@"CategoryId":@(self.categropId),
-                     @"BeginTime":self.beginTime,
-                     @"EndTime":self.endTime,
-                     @"Sort":@(self.type),
-                     @"TeacherId":teacherArray,
-                     @"Unit":@[],
-                     @"Press":chuDepArray,
-        };
+        self.teacherArray = teacherArray;
+        self.pressArray = chuDepArray;
     }
-    NSLog(@"%@",[self DictJSONString:paraDict]);
-    [[HttpManager sharedHttpManager] POSTUrl:Host(API_APP_Content_Navi_List) parameters:paraDict responseStyle:JOSN success:^(id  _Nonnull responseObject) {
-        NSLog(@"++++%@",responseObject);
-        if ([responseObject isKindOfClass:[NSDictionary class]]) {
-            for (NSDictionary * dict in responseObject[@"Items"]) {
-                HomeSubItemModel * model = [HomeSubItemModel modelWithDictionary:dict];
-                [weakSelf.listArray addObject:model];
-            }
-        }
-        dispatch_async(dispatch_get_main_queue(), ^{
-            [weakSelf.rightTableV reloadData];
-        });
-    } failure:^(NSError * _Nonnull error) {
-        
-    }];
+//    NSLog(@"%@",[self DictJSONString:paraDict]);
+    [self headRefresh];
 }
 - (NSString *)DictJSONString:(NSDictionary *)dict {
     NSData *data = [NSJSONSerialization dataWithJSONObject:dict
@@ -991,6 +994,7 @@
                                 @"TeacherId":@[],
                                 @"Unit":@[],
                                 @"Press":@[],
+                                @"IsApp":@(YES)
     };
     [[HttpManager sharedHttpManager] POSTUrl:Host(API_APP_PAGE_Navigation_Search) parameters:paraDict responseStyle:JOSN success:^(id  _Nonnull responseObject) {
         NSLog(@"%@",responseObject);
@@ -1044,18 +1048,12 @@
             }];
             WS(weakSelf);
             [self.beginBtn setAction:^{
-                [[MOFSPickerManager shareManger] showDatePickerWithTag:2 commitBlock:^(NSDate *date) {
-                    weakSelf.beginTime = [weakSelf stringToDate:date];
-                    [weakSelf.beginBtn setTitle:weakSelf.beginTime forState:UIControlStateNormal];
-                } cancelBlock:^{
-                }];
+                NSString * time = weakSelf.beginTime.length > 0 ? weakSelf.beginTime : @"2000-01-01";
+                [weakSelf choseDate:time isBegin:YES];
             }];
             [self.endBtn setAction:^{
-                [[MOFSPickerManager shareManger] showDatePickerWithTag:2 commitBlock:^(NSDate *date) {
-                    weakSelf.endTime = [weakSelf stringToDate:date];
-                    [weakSelf.endBtn setTitle:weakSelf.endTime forState:UIControlStateNormal];
-                } cancelBlock:^{
-                }];
+                NSString * time = weakSelf.endTime.length > 0 ? weakSelf.endTime : [weakSelf stringToDate:[NSDate date]];
+                [weakSelf choseDate:weakSelf.endTime isBegin:NO];
             }];
             return view;
         }
@@ -1183,6 +1181,13 @@
     NSString * string = [dateformat stringFromDate:date];
     return string;
 }
+- (NSDate *)dateToString:(NSString *)string
+{
+    NSDateFormatter *dateformat = [[NSDateFormatter alloc]init];
+    dateformat.dateFormat = @"yyyy-MM-dd";
+    NSDate * date = [dateformat dateFromString:string];
+    return date;
+}
 - (BOOL)checkTimeVlaidate
 {
     NSDateFormatter *dateformat = [[NSDateFormatter alloc]init];
@@ -1195,4 +1200,42 @@
         return NO;
     }
 }
+- (void)choseDate:(NSString *)date isBegin:(BOOL)isBegin
+{
+    WS(weakSelf);
+    BRDatePickerView *datePickerView = [[BRDatePickerView alloc]init];
+    datePickerView.pickerMode = BRDatePickerModeYMD;
+    datePickerView.title = @"";
+    datePickerView.selectDate = [self dateToString:date];
+    datePickerView.selectValue = date;
+    datePickerView.minDate = [NSDate br_setYear:1948 month:1 day:1];
+    datePickerView.maxDate = [NSDate br_setYear:2100 month:1 day:1];
+    datePickerView.isAutoSelect = YES;
+    datePickerView.addCustomString = @"";
+    // 指定不可选择的日期
+    //datePickerView.nonSelectableDates = @[[NSDate br_setYear:2020 month:7 day:25], [NSDate br_setYear:2020 month:8 day:26]];
+    datePickerView.keyView = self.view; // 将组件 datePickerView 添加到 self.view 上,默认是添加到 keyWindow 上
+    datePickerView.resultBlock = ^(NSDate *selectDate, NSString *selectValue) {
+        if (isBegin) {
+            weakSelf.beginTime = selectValue;
+            [weakSelf.beginBtn setTitle:weakSelf.beginTime forState:UIControlStateNormal];
+        }else{
+            weakSelf.endTime = selectValue;
+            [weakSelf.endBtn setTitle:weakSelf.endTime forState:UIControlStateNormal];
+        }
+    };
+    
+    BRPickerStyle *customStyle = [[BRPickerStyle alloc]init];
+    customStyle.pickerColor = [UIColor whiteColor];
+    customStyle.pickerTextFont = [UIFont systemFontOfSize:14];
+    customStyle.pickerTextColor = UIColorHex(0x666666);
+    customStyle.selectRowTextFont = [UIFont systemFontOfSize:20];
+    customStyle.selectRowTextColor = UIColorHex(0x0B0B0B);
+    customStyle.cancelTextColor = [UIColor colorWithRed:0.090  green:0.463  blue:0.906 alpha:1];
+    customStyle.cancelTextFont = [UIFont systemFontOfSize:14];
+    customStyle.doneTextColor = [UIColor colorWithRed:0.090  green:0.463  blue:0.906 alpha:1];
+    customStyle.doneTextFont = [UIFont systemFontOfSize:14];
+    datePickerView.pickerStyle = customStyle;
+    [datePickerView show];
+}
 @end

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 868 - 48
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookListDetailVC.m


+ 1 - 0
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookMingDetailVC.h

@@ -12,6 +12,7 @@
 NS_ASSUME_NONNULL_BEGIN
 
 @interface BookMingDetailVC : WMZPageController
+@property (assign, nonatomic) MediaType      type;
 @property (assign, nonatomic) NSInteger      gzId;
 @property (copy, nonatomic) NSString        *titleStr;
 +(BookMingDetailVC *)initBookMingDetailVC;

+ 96 - 17
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookMingDetailVC.m

@@ -14,14 +14,15 @@
 #import "BookSubMusicVC.h"
 #import "BookIntroductionVC.h"
 #import "BookMeidaModel.h"
+#import "MoveViewController.h"
 
 @interface BookMingDetailVC ()<UIScrollViewDelegate>
-@property (weak, nonatomic) IBOutlet UIView *navBar;
+@property (weak, nonatomic) IBOutlet UIView   *navBar;
 @property (weak, nonatomic) IBOutlet UIButton *backBtn;
 @property (weak, nonatomic) IBOutlet UIButton *menuBtn;
 @property (weak, nonatomic) IBOutlet UIButton *shareBtn;
 @property (weak, nonatomic) IBOutlet UILabel *titleL;
-@property (weak, nonatomic) IBOutlet UIView *bottomView;
+@property (weak, nonatomic) IBOutlet UIView  *bottomView;
 @property (strong,nonatomic) DrawerView      *drawerView;
 @property (strong,nonatomic) UILabel         *contentL;
 @property (strong,nonatomic) UIButton        *moreBtn;
@@ -102,15 +103,22 @@
         };
         weakSelf.drawerView.frame = CGRectMake(0,0, SCREEN_WIDTH, SCREEN_HEIGHT);// - kNavigationHeight
     }];
-    
     [self getHeadData];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(collectSuccess) name:COLLECTSUCCESS object:nil];
 }
 - (void)addHeadView
 {
     WS(weakSelf);
+    BookSubArticeVC * articeVC = [BookSubArticeVC new];
+    articeVC.Id = self.gzId;
+    BookSubVideoVC * videoVC = [BookSubVideoVC new];
+    videoVC.Id = self.gzId;
+    BookSubMusicVC * musicVC = [BookSubMusicVC new];
+    musicVC.Id = self.gzId;
+    
     WMZPageParam *param = PageParam()
     .wTitleArrSet(@[@"文章",@"视频",@"音频"])
-    .wControllersSet(@[[BookSubArticeVC new],[BookSubVideoVC new],[BookSubMusicVC new]])
+    .wControllersSet(@[articeVC,videoVC,musicVC])
     //固定在所有子控制器底部  需要放在第一个控制器里 例如此例子
     .wFixFirstSet(YES)
     //悬浮开启
@@ -118,7 +126,7 @@
     //等分
     .wMenuTitleWidthSet(PageVCWidth/3)
     .wMenuCellPaddingSet(45 - 21.5)
-    .wTopOffsetSet(-NAVH)
+    .wTopOffsetSet(NAVH)
     .wFromNaviSet(YES)
     .wMenuAnimalSet(PageTitleMenuLine)
     .wMenuTitleFontSet(16.f)
@@ -179,6 +187,7 @@
 - (void)dealloc
 {
     [self.upSc removeObserver:self forKeyPath:@"currentTitleIndex"];
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
 }
 - (UILabel *)contentL
 {
@@ -210,7 +219,7 @@
 }
 - (void)getHeadData
 {
-    NSString * url = [NSString stringWithFormat:@"%@%ld",Host(API_APP_Media),self.gzId];
+    NSString * url = [NSString stringWithFormat:@"%@%ld",Host(API_APP_PAGE_Attach),self.gzId];
     WS(weakSelf);
     [[HttpManager sharedHttpManager] GETUrl:url parameters:@{} responseStyle:JOSN success:^(id  _Nonnull responseObject) {
         NSLog(@"%@",responseObject);
@@ -242,10 +251,10 @@
         make.centerX.mas_equalTo(subView);
     }];
     imagV.contentMode = UIViewContentModeScaleToFill;
-    [imagV sd_setImageWithURL:[NSURL URLWithString:self.model.ImageUrls] placeholderImage:IMG(@"img_placeHolder")];
+    [imagV sd_setImageWithURL:[NSURL URLWithString:self.model.ImageUrl] placeholderImage:IMG(@"img_placeHolder")];
     UILabel * bookL = [UILabel new];
     [subView addSubview:bookL];
-    bookL.text = self.model.Title;
+    bookL.text = self.model.Name;
     bookL.textColor = UIColorHex(0x0a0a0a);
     bookL.font = [UIFont systemFontOfSize:22];
     [bookL mas_makeConstraints:^(MASConstraintMaker *make) {
@@ -254,7 +263,7 @@
     }];
     UILabel * nameL = [UILabel new];
     [subView addSubview:nameL];
-    nameL.text = @"公众号";
+    nameL.text = self.type == MediaMingType ? @"名栏" : @"公众号";
     nameL.textColor = UIColorHex(0x666666);
     nameL.font = [UIFont systemFontOfSize:14];
     [nameL mas_makeConstraints:^(MASConstraintMaker *make) {
@@ -320,7 +329,7 @@
     
     UILabel * readL = [UILabel new];
     [view addSubview:readL];
-    readL.text = @"阅读此公众号";
+    readL.text = self.type == MediaMingType ? @"阅读此名栏" : @"阅读此公众号";;
     readL.textColor = UIColorHex(0x99A0AA);
     readL.font = [UIFont systemFontOfSize:11];
     [readL mas_makeConstraints:^(MASConstraintMaker *make) {
@@ -474,6 +483,9 @@
 }
 - (NSAttributedString *)AttributedwithText:(NSString *)text
 {
+    if (text.length == 0) {
+        return [[NSMutableAttributedString alloc] initWithString:@""];
+    }
     NSMutableAttributedString *mutableAttributedString = [[NSMutableAttributedString alloc] initWithString:text];
     [mutableAttributedString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:17] range:NSMakeRange(0, text.length)];
     [mutableAttributedString addAttribute:NSForegroundColorAttributeName value:UIColorHex(0x999999) range:NSMakeRange(0, text.length - 2)];
@@ -481,7 +493,9 @@
     return mutableAttributedString;
 }
 - (NSArray *)getLinesArrayOfStringInText:(NSString *)text width:(CGFloat)width{
-    
+    if (text.length == 0) {
+        return @[];
+    }
     UIFont *font = [UIFont systemFontOfSize:17];
     CTFontRef myFont = CTFontCreateWithName(( CFStringRef)([font fontName]), [font pointSize], NULL);
     NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:text];
@@ -511,7 +525,7 @@
 - (void)setArticeBtnView
 {
     [self.bottomView removeAllSubviews];
-    NSArray * array = @[@"听",@"免费阅读",@"收藏"];
+    NSArray * array = @[@"听",@"免费阅读",self.model.IsCollect ? @"已收藏" : @"收藏"];
     for (NSInteger i = 0; i < array.count; i ++) {
         UIButton * btn = [UIButton new];
         btn.tag = i;
@@ -531,7 +545,8 @@
 {
     [self.bottomView removeAllSubviews];
     UIButton * btn = [UIButton new];
-    [btn setTitle:@"收藏" forState:UIControlStateNormal];
+    [btn setTitle:self.model.IsCollect ? @"已收藏" : @"收藏" forState:UIControlStateNormal];
+    btn.tag = 2;
     [btn addTarget:self action:@selector(clickBtnAction:) forControlEvents:UIControlEventTouchUpInside];
     btn.titleLabel.font = [UIFont systemFontOfSize:12];
     [btn setTitleColor:UIColorHex(0x858C96) forState:UIControlStateNormal];
@@ -543,10 +558,10 @@
 - (void)setMusicBtnView
 {
     [self.bottomView removeAllSubviews];
-    NSArray * array = @[@"听",@"收藏"];
+    NSArray * array = @[@"听",self.model.IsCollect ? @"已收藏" : @"收藏"];
     for (NSInteger i = 0; i < array.count; i ++) {
         UIButton * btn = [UIButton new];
-        btn.tag = i;
+        btn.tag = i > 0 ? 2 : i;
         [btn setTitle:array[i] forState:UIControlStateNormal];
         [btn addTarget:self action:@selector(clickBtnAction:) forControlEvents:UIControlEventTouchUpInside];
         btn.titleLabel.font = [UIFont systemFontOfSize:12];
@@ -561,7 +576,7 @@
 }
 - (void)clickBtnAction:(UIButton *)sender
 {
-    switch (self.selectIndex) {
+    switch (sender.tag) {
         case 0:
         {
             
@@ -574,10 +589,74 @@
             break;
         default:
         {
-            
+            [self collectAction];
         }
             break;
     }
 }
+- (void)collectAction
+{
+    WS(weakSelf);
+    if (self.model.IsCollect) {
+        dispatch_async(dispatch_get_main_queue(), ^{
+            UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"真的取消收藏吗?" message:nil preferredStyle:UIAlertControllerStyleAlert];
+            UIAlertAction *actionYes = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
+                NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
+                [dic setValue:@(weakSelf.gzId) forKey:@"CollectionDataId"];
+                ///     1文章 2话题 3 收藏 4笔记 5通知 6站内信 7小组 8 会议详情 14工作流审批 300 文件 400 会议纪要
+                [dic setValue:@(CollectModel_Ming) forKey:@"CollectionType"];
+                [dic setValue:@(0) forKey:@"FolderId"];
+                [dic setValue:@(0) forKey:@"SourceUserId"];
+                dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+                    [[HttpManager sharedHttpManager] PUTUrl:Host(API_CreateCollect) parameters:dic success:^(id  _Nonnull responseObject) {
+                        weakSelf.model.IsCollect = NO;
+                        for (UIButton * btn in weakSelf.bottomView.subviews) {
+                            if (btn.tag == 2) {
+                                [btn setTitle:@"收藏" forState:UIControlStateNormal];
+                            }
+                        }
+                    } failure:^(NSError * _Nonnull error) {
+
+                    }];
+                });
+            }];
+            UIAlertAction *actionNo = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
+
+            }];
+            [alert addAction:actionYes];
+            [alert addAction:actionNo];
+            [weakSelf presentViewController:alert animated:YES completion:^{
+                
+            }];
+        });
+    }else{
+        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+            [weakSelf gotoCollectHander];
+        });
+    }
+}
+- (void)gotoCollectHander{
+    MoveViewController *vc = [MoveViewController initMoveViewController];
+    //NSInteger meetId = [self.dataDict[@"MeetingId"] integerValue];
+    vc.CollectionDataId = self.gzId;
+    vc.collectType = CollectHanderType_Collect;
+    vc.CollectionType = CollectModel_Ming;
+    vc.ParentId = 0;
+    vc.titleStr = @"我的收藏";
+    vc.TypeId = CreateCollectionType;
+    vc.FolderIds = @[].mutableCopy;
+    //    收藏类型 1文章 2话题 3 收藏 4笔记 5通知 6站内信 7小组 8 会议详情 14工作流审批 300 文件 400 会议纪要
+    [self.navigationController pushViewController:vc animated:YES];
+}
+- (void)collectSuccess
+{
+    self.model.IsCollect = YES;
+    for (UIButton * btn in self.bottomView.subviews) {
+        if (btn.tag == 2) {
+            [btn setTitle:@"已收藏" forState:UIControlStateNormal];
+        }
+    }
+}
+
 @end
 

+ 17 - 4
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookMingVC.m

@@ -38,6 +38,7 @@
 #import "BookHomeModel.h"
 #import "HomeSubModel.h"
 #import "HomeSubItemModel.h"
+#import "BookMingSearchVC.h"
 
 @interface BookMingVC ()<UITableViewDelegate,UITableViewDataSource>
 @property (weak, nonatomic) IBOutlet UITableView *tableView;
@@ -83,6 +84,11 @@
         make.left.right.mas_equalTo(self.HeadView);
         make.height.mas_offset(36);
     }];
+    WS(weakSelf);
+    [self.SearchView.button setAction:^{
+        BookMingSearchVC * vc = [[BookMingSearchVC alloc] init];
+        [weakSelf.navigationController pushViewController:vc animated:YES];
+    }];
     self.TitleL.text = self.titleStr;
     [self getData];
 }
@@ -95,9 +101,13 @@
         if ([responseObject isKindOfClass:[NSArray class]]) {
             for (NSDictionary * dict in responseObject) {
                 HomeSubModel * model = [HomeSubModel modelWithDictionary:dict];
-                if (model.Items.count > 0) {
-                    [weakSelf.dataArray addObject:model];
+                NSMutableArray * array = [NSMutableArray array];
+                for (NSDictionary * subDict in model.Items) {
+                    HomeSubItemModel * smodel = [HomeSubItemModel modelWithDictionary:subDict];
+                    [array addObject:smodel];
                 }
+                model.Items = array.mutableCopy;
+                [weakSelf.dataArray addObject:model];
             }
         }
         dispatch_async(dispatch_get_main_queue(), ^{
@@ -117,9 +127,9 @@
     return 1;
 }
 
-
 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
-    return 111 * 3;
+    HomeSubModel * model = [self.dataArray objectAtIndex:indexPath.section];
+    return 111 * (model.Items.count > 3 ? 3 : model.Items.count);
 }
 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
@@ -181,6 +191,9 @@
     WS(weakSelf);
     cell.ClickItemBlock = ^(NSInteger Item, HomeSubItemModel * reModel) {
         BookMingDetailVC * vc = [BookMingDetailVC initBookMingDetailVC];
+        vc.gzId = reModel.Id;
+        vc.type = reModel.MediaType;
+        vc.titleStr = reModel.Title;
         [weakSelf.navigationController pushViewController:vc animated:YES];
     };
     return cell;

+ 32 - 13
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookRead/viewcontroller/BookReadVC.m

@@ -46,8 +46,8 @@
 @property (nonatomic,strong) NSMutableArray *fontArray;//字体
 @property (nonatomic,strong) NSMutableArray *listArray;//字体
 @property (nonatomic, strong) NSArray<NSMutableAttributedString *> *pageContentArray;
-@property (nonatomic,copy) NSString *textFontSize;
-@property (nonatomic,copy) NSString *fontIndex;
+@property (nonatomic,copy) NSString         *textFontSize;
+@property (nonatomic,copy) NSString         *fontIndex;
 @property (nonatomic,strong) BookListModel  *model;
 @property (nonatomic,assign) BOOL            next;//下一章
 @property (nonatomic,assign) NSInteger       allCount;//下一章
@@ -215,6 +215,7 @@
         }];
     }
     self.toolViewShow = !self.toolViewShow;
+    [self setNeedsStatusBarAppearanceUpdate];
 }
 #pragma mark  - delegate
 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
@@ -491,10 +492,10 @@
 //        //不是第一页,则页码减一
 //        _currentIndex--;
 //    }
-    if (self.currentId < 1) {
+    if (self.currentId <= 1) {
         return nil;
     }
-    if(_currentIndex == 0){
+    if(_currentIndex == 0 && self.currentId > 1){
         //非第一章第一页,加载上一章的内容,
         self.next = NO;
         self.currentId --;
@@ -502,11 +503,12 @@
         [self getData];
 //        [self loadChapterContentWithIndex:_currentChapter];
 //        _currentIndex = self.pageContentArray.count - 1;
+        return nil;
     }else{
         //不是第一页,则页码减一
         _currentIndex--;
+        return [self viewControllerAtIndex:_currentIndex];
     }
-    return [self viewControllerAtIndex:_currentIndex];
 }
 
 #pragma mark 返回下一个ViewController对象
@@ -531,18 +533,19 @@
     if (self.allCount == self.currentId) {
         return nil;
     }
-    if(_currentIndex >= self.pageContentArray.count - 1){
+    if(_currentIndex >= (self.pageContentArray.count - 1)){
         //非最后一章的最后一页,加载下一章内容
         self.next = YES;
         self.currentId ++;
         [self foundModel:self.currentId];
         [self getData];
         _currentIndex = 0;
+        return nil;
     }else{
         //不是最后一页
         _currentIndex++;
+        return [self viewControllerAtIndex:_currentIndex];
     }
-    return [self viewControllerAtIndex:_currentIndex];
 }
 #pragma mark  - notification
 
@@ -607,12 +610,14 @@
     [self.chapterArr removeAllObjects];
     [[HttpManager sharedHttpManager] POSTUrl:Host(API_APP_Media_Book_Content) parameters:paraDict responseStyle:JOSN success:^(id  _Nonnull responseObject) {
         NSLog(@"%@",responseObject);
-        [weakSelf.chapterArr addObject:responseObject[@"Data"]];
-        NSString * stlyeStr = [[NSUserDefaults standardUserDefaults]objectForKey:DCStlyeStauts];
-        dispatch_async(dispatch_get_main_queue(), ^{
-            [weakSelf loadChapterContentWithIndex:weakSelf.currentChapter];
-            [weakSelf setUpPageViewController:[stlyeStr integerValue]];
-        });
+        if ([responseObject[@"Data"] length] > 0) {
+            [weakSelf.chapterArr addObject:responseObject[@"Data"]];
+            NSString * stlyeStr = [[NSUserDefaults standardUserDefaults]objectForKey:DCStlyeStauts];
+            dispatch_async(dispatch_get_main_queue(), ^{
+                [weakSelf loadChapterContentWithIndex:weakSelf.currentChapter];
+                [weakSelf setUpPageViewController:[stlyeStr integerValue]];
+            });
+        }
     } failure:^(NSError * _Nonnull error) {
         
     }];
@@ -844,4 +849,18 @@
     }
     return _chapterArr;
 }
+- (BOOL)prefersStatusBarHidden
+{
+    if(self.toolViewShow)
+    {
+        return NO;
+    }else
+    {
+        return YES;
+    }
+}
+-(UIStatusBarStyle)preferredStatusBarStyle
+{
+    return UIStatusBarStyleLightContent;
+}
 @end

+ 18 - 0
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSearch/BookGongzhSearchVC.h

@@ -0,0 +1,18 @@
+//
+//  BookGongzhSearchVC.h
+//  smartRhino
+//
+//  Created by niuzhen on 2020/2/26.
+//  Copyright © 2020 tederen. All rights reserved.
+//
+
+#import "SearchBaseVC.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface BookGongzhSearchVC : SearchBaseVC
+@property (nonatomic,assign) NSInteger  Id;
+@property (nonatomic,assign) NSInteger  chanelId;
+@end
+
+NS_ASSUME_NONNULL_END

+ 130 - 0
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSearch/BookGongzhSearchVC.m

@@ -0,0 +1,130 @@
+//
+//  BookGongzhSearchVC.m
+//  smartRhino
+//
+//  Created by niuzhen on 2020/2/26.
+//  Copyright © 2020 tederen. All rights reserved.
+//
+
+#import "BookGongzhSearchVC.h"
+#import "BookPublicBookCell.h"
+#import "BookChanelRightModel.h"
+#import "BookMingDetailVC.h"
+
+@interface BookGongzhSearchVC ()<UITableViewDelegate,UITableViewDataSource>
+@property (nonatomic, assign) NSUInteger  currentPage;
+@property (nonatomic, assign) NSUInteger  Total;
+@property (nonatomic, strong) NSMutableArray  *dataArray;
+
+@end
+
+@implementation BookGongzhSearchVC
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    self.fd_prefersNavigationBarHidden = YES;
+    self.view.backgroundColor = RGB(255, 255, 255);
+    self.tableView.delegate = self;
+    self.tableView.dataSource = self;
+    self.historySearchType = HistorySearchType_BookGongZH;
+    [self addObserver:self forKeyPath:@"searchText" options:NSKeyValueObservingOptionNew context:nil];
+}
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
+{
+    id obj = [change objectForKey:@"new"];
+    NSString * text = @"";
+    if ([obj isKindOfClass:[NSString class]]) {
+        text = obj;
+    }else{
+        text  = [obj stringValue];
+    }
+    if (text.length > 0) {
+        [self headRefresh];
+    }
+}
+- (NSMutableArray *)dataArray
+{
+    if (!_dataArray) {
+        _dataArray = [NSMutableArray array];
+    }
+    return _dataArray;
+}
+#pragma mark - UItableView刷新
+- (void)setTableViewRefresh{
+    WeakSelf(self)
+    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
+        [weakself headRefresh];
+    }];
+    self.tableView.mj_footer = [MJRefreshBackStateFooter footerWithRefreshingBlock:^{
+        [weakself footerRefresh];
+    }];
+    [self.tableView.mj_header beginRefreshing];
+}
+
+- (void)headRefresh{
+    self.currentPage = 1;
+    self.Total = 0;
+    [self.dataArray removeAllObjects];
+    [self getData];
+    [self.tableView.mj_header endRefreshing];
+}
+
+- (void)footerRefresh{
+    self.currentPage += 1;
+    if (self.Total == self.dataArray.count) {
+        self.currentPage --;
+        [self.tableView.mj_footer resetNoMoreData];
+        return;
+    }
+    [self.tableView.mj_footer endRefreshing];
+}
+- (void)getData
+{
+    WS(weakSelf);
+    [[HttpManager sharedHttpManager] POSTUrl:Host(API_APP_Page_Banner_Search) parameters:@{@"ChannelId":@(self.chanelId),@"CategoryId":@(self.Id),@"Page":@(self.currentPage),@"PerPage":@(20)} responseStyle:JOSN success:^(id  _Nonnull responseObject) {
+        NSLog(@"++%@",responseObject);
+        if ([responseObject isKindOfClass:[NSDictionary class]]) {
+            if ([responseObject[@"Items"] isKindOfClass:[NSArray class]]) {
+                for (NSDictionary * sDict in responseObject[@"Items"]) {
+                    BookChanelRightModel * smodel = [BookChanelRightModel modelWithDictionary:sDict];
+                    [weakSelf.dataArray addObject:smodel];
+                }
+            }
+            weakSelf.Total = [responseObject[@"Total"] integerValue];
+            if (weakSelf.dataArray.count == weakSelf.Total) {
+                [weakSelf.tableView.mj_footer endRefreshingWithNoMoreData];
+                weakSelf.tableView.mj_footer.hidden = YES;
+            }
+            [weakSelf.tableView.mj_header endRefreshing];
+            [weakSelf.tableView.mj_footer endRefreshing];
+        }
+        dispatch_async(dispatch_get_main_queue(), ^{
+            [weakSelf.tableView reloadData];
+        });
+    } failure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
+{
+    return self.dataArray.count;
+}
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    BookChanelRightModel * model = [self.dataArray objectAtIndex:indexPath.row];
+    BookPublicBookCell * cell = [BookPublicBookCell configCell:tableView indexPath:indexPath];
+    [cell setDataModel:model withSearchText:self.searchText];
+    return cell;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    BookChanelRightModel * model = [self.dataArray objectAtIndex:indexPath.row];
+    BookMingDetailVC * vc = [BookMingDetailVC initBookMingDetailVC];
+    vc.gzId = model.Id;
+    vc.type = model.MediaType;
+    vc.titleStr = model.Title;
+    [self.navigationController pushViewController:vc animated:YES];
+}
+@end

+ 29 - 16
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSearch/BookLabelAllVC.m

@@ -18,16 +18,19 @@
 #import "BookWCDetailVC.h"
 #import "BookListenVC.h"
 #import "BookListDetailVC.h"
-#import "TDSearchBar.h"
+#import "MyTDGroupView.h"
+#import "BookLabelSearchVC.h"
 
-@interface BookLabelAllVC ()<UIScrollViewDelegate>
-@property (weak, nonatomic) IBOutlet UILabel  *titleL;
+@interface BookLabelAllVC ()
+@property (weak, nonatomic) IBOutlet UILabel     *titleL;
 @property (weak, nonatomic) IBOutlet UITableView *tableView;
-@property (nonatomic, strong) NSMutableArray  *dataArray;
-@property (nonatomic, copy) NSString          *searchText;
+@property (weak, nonatomic) IBOutlet UIView      *searchView;
+@property (nonatomic, strong) NSMutableArray     *dataArray;
+@property (nonatomic, copy) NSString             *searchText;
 @property (nonatomic, assign) NSInteger        currentPage;
 @property (nonatomic, assign) NSInteger        Total;
-@property (nonatomic, strong) TDSearchBar     *searchBar;
+@property (strong, nonatomic) MyTDGroupView   *searchv;
+
 @end
 
 @implementation BookLabelAllVC
@@ -42,17 +45,35 @@
     }
     return _dataArray;
 }
-
+- (MyTDGroupView *)searchv
+{
+    if (!_searchv) {
+        _searchv = [[MyTDGroupView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 36)];
+    }
+    return _searchv;
+}
 
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.fd_prefersNavigationBarHidden = YES;
     self.view.backgroundColor = UIColorHex(0xF8F8F8);
     WS(weakSelf);
+    [self.searchView addSubview:self.searchv];
+    [self.searchv mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_offset(6);
+        make.left.right.mas_equalTo(self.searchView);
+        make.height.mas_offset(36);
+    }];
+    
     self.tableView.mj_footer = [MJRefreshBackStateFooter footerWithRefreshingBlock:^{
         [weakSelf footerRefresh];
     }];
     self.titleL.text = self.titleStr;
+    [self.searchv.button setAction:^{
+        BookLabelSearchVC * vc = [[BookLabelSearchVC alloc] init];
+        vc.Id = weakSelf.Id;
+        [weakSelf.navigationController pushViewController:vc animated:YES];
+    }];
     [self getData];
 }
 
@@ -221,13 +242,5 @@
             break;
     }
 }
-#pragma mark - Delegata
-- (void)scrollViewDidScroll:(UIScrollView *)scrollView
-{
-    [self setEditing:YES];
-}
-- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
-    self.searchText = searchBar.text;
-    [self getData];
-}
+
 @end

+ 17 - 0
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSearch/BookLabelSearchVC.h

@@ -0,0 +1,17 @@
+//
+//  BookLabelSearchVC.h
+//  smartRhino
+//
+//  Created by niuzhen on 2020/2/26.
+//  Copyright © 2020 tederen. All rights reserved.
+//
+
+#import "SearchBaseVC.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface BookLabelSearchVC : SearchBaseVC
+@property (nonatomic,assign) NSInteger  Id;
+@end
+
+NS_ASSUME_NONNULL_END

+ 237 - 0
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSearch/BookLabelSearchVC.m

@@ -0,0 +1,237 @@
+//
+//  BookLabelSearchVC.m
+//  smartRhino
+//
+//  Created by niuzhen on 2020/2/26.
+//  Copyright © 2020 tederen. All rights reserved.
+//
+
+#import "BookLabelSearchVC.h"
+#import "HomeWeiCousreCell.h"
+#import "BookSubArticeCell.h"
+#import "HomeTeacherCell.h"
+#import "HomeMusicCell.h"
+#import "HomeSchoolCell.h"
+#import "IndexGoodBookCell.h"
+#import "HomeSubItemModel.h"
+#import "BookTeacherDetailVC.h"
+#import "BookWCDetailVC.h"
+#import "BookListenVC.h"
+#import "BookListDetailVC.h"
+
+@interface BookLabelSearchVC ()<UITableViewDelegate,UITableViewDataSource>
+@property (nonatomic, assign) NSUInteger  currentPage;
+@property (nonatomic, assign) NSUInteger  Total;
+@property (nonatomic, strong) NSMutableArray  *dataArray;
+
+@end
+
+@implementation BookLabelSearchVC
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    self.fd_prefersNavigationBarHidden = YES;
+    self.view.backgroundColor = RGB(255, 255, 255);
+    self.tableView.delegate = self;
+    self.tableView.dataSource = self;
+    self.historySearchType = HistorySearchType_BookLabel;
+    [self addObserver:self forKeyPath:@"searchText" options:NSKeyValueObservingOptionNew context:nil];
+}
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
+{
+    id obj = [change objectForKey:@"new"];
+    NSString * text = @"";
+    if ([obj isKindOfClass:[NSString class]]) {
+        text = obj;
+    }else{
+        text  = [obj stringValue];
+    }
+    if (text.length > 0) {
+        [self headRefresh];
+    }
+}
+- (NSMutableArray *)dataArray
+{
+    if (!_dataArray) {
+        _dataArray = [NSMutableArray array];
+    }
+    return _dataArray;
+}
+#pragma mark - UItableView刷新
+- (void)setTableViewRefresh{
+    WeakSelf(self)
+    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
+        [weakself headRefresh];
+    }];
+    self.tableView.mj_footer = [MJRefreshBackStateFooter footerWithRefreshingBlock:^{
+        [weakself footerRefresh];
+    }];
+    [self.tableView.mj_header beginRefreshing];
+}
+
+- (void)headRefresh{
+    self.currentPage = 1;
+    self.Total = 0;
+    [self.dataArray removeAllObjects];
+    [self getData];
+    [self.tableView.mj_header endRefreshing];
+}
+
+- (void)footerRefresh{
+    self.currentPage += 1;
+    if (self.Total == self.dataArray.count) {
+        self.currentPage --;
+        [self.tableView.mj_footer resetNoMoreData];
+        return;
+    }
+    [self.tableView.mj_footer endRefreshing];
+}
+- (void)getData
+{
+    WS(weakSelf);
+    SHOWLOADING
+    NSDictionary * paraDict = @{@"LableId":@(self.Id),
+                                @"Page":@(self.currentPage),
+                                @"PerPage":@(10),
+                                @"KeyWord":self.searchText
+    };
+    [[HttpManager sharedHttpManager] GETUrl:Host(API_APP_Media_Lable_List) parameters:paraDict responseStyle:JOSN success:^(id  _Nonnull responseObject) {
+        REMOVESHOW
+        NSLog(@"%@",responseObject);
+        if ([responseObject isKindOfClass:[NSDictionary class]]) {
+            for (NSDictionary * dict in responseObject[@"Items"]) {
+                HomeSubItemModel * model = [HomeSubItemModel modelWithDictionary:dict];
+                [weakSelf.dataArray addObject:model];
+            }
+        }
+        weakSelf.Total = [responseObject[@"Total"] integerValue];
+        [weakSelf.tableView.mj_footer endRefreshing];
+        dispatch_async(dispatch_get_main_queue(), ^{
+            [weakSelf.tableView reloadData];
+        });
+    } failure:^(NSError * _Nonnull error) {
+        REMOVESHOW
+    }];
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
+{
+    return self.dataArray.count;
+}
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    HomeSubItemModel * model = [self.dataArray objectAtIndex:indexPath.row];
+    switch ((CollectModelType)model.MediaType) {
+        case CollectModel_StoreBook:
+        {
+            IndexGoodBookCell * cell = [IndexGoodBookCell configCell0:tableView indexPath:indexPath];
+            [cell setDataWithModel:model searchText:self.searchText];
+//            if (self.dataArray.count == indexPath.row + 1) {
+//                cell.lineV.hidden = YES;
+//            }
+            return cell;
+        }
+            break;
+        case CollectModel_StoreVideo:
+        {
+            HomeWeiCousreCell * cell = [HomeWeiCousreCell configCell0:tableView indexPath:indexPath];
+            [cell setDataWithIndexModel:model searchText:self.searchText];
+//            if (self.dataArray.count == indexPath.row + 1) {
+//                cell.lineV.hidden = YES;
+//            }
+            return cell;
+        }
+            break;
+        case CollectModel_StoreSound:
+        {
+            HomeMusicCell * cell = [HomeMusicCell configCell:tableView indexPath:indexPath];
+            [cell setDataWithModel:model searchText:self.searchText];
+//            if (self.dataArray.count == indexPath.row + 1) {
+//                cell.lineV.hidden = YES;
+//            }
+            return cell;
+        }
+            break;
+        case CollectModel_Teacher:
+        {
+            HomeTeacherCell * cell = [HomeTeacherCell configCell:tableView indexPath:indexPath];
+            [cell setDataWithModel:model searchText:self.searchText];
+//            if (self.dataArray.count == indexPath.row + 1) {
+//                cell.lineV.hidden = YES;
+//            }
+            return cell;
+        }
+            break;
+        case CollectModel_Organization:
+        {
+            HomeSchoolCell * cell = [HomeSchoolCell configCell1:tableView indexPath:indexPath];
+            [cell setDataIndexModel:model searchText:self.searchText];
+//            if (self.dataArray.count == indexPath.row + 1) {
+//                cell.lineV.hidden = YES;
+//            }
+            return cell;
+        }
+            break;
+        default:
+        {
+            IndexGoodBookCell * cell = [IndexGoodBookCell configCell0:tableView indexPath:indexPath];
+            [cell setDataWithModel:model searchText:self.searchText];
+//            if (self.dataArray.count == indexPath.row + 1) {
+//                cell.lineV.hidden = YES;
+//            }
+            return cell;
+        }
+            break;
+    }
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    HomeSubItemModel * model = [self.dataArray objectAtIndex:indexPath.row];
+    [tableView deselectRowAtIndexPath:indexPath animated:YES];
+    switch ((CollectModelType)model.MediaType) {
+        case CollectModel_StoreBook:
+        {
+            BookListDetailVC * vc = [BookListDetailVC initBookListDetailVC];
+            vc.Id = model.Id;
+            [self.navigationController pushViewController:vc animated:YES];
+        }
+            break;
+        case CollectModel_StoreVideo:
+        {
+            BookWCDetailVC * vc = [BookWCDetailVC initBookWCDetailVC];
+            vc.Id = model.Id;
+            [self.navigationController pushViewController:vc animated:YES];
+        }
+            break;
+        case CollectModel_StoreSound:
+        {
+            BookListenVC * vc = [BookListenVC initBookListenVC];
+            vc.Id = model.Id;
+            vc.MediaType = MediaMusicType;
+            [self.navigationController pushViewController:vc animated:YES];
+        }
+            break;
+        case CollectModel_Teacher:
+        {
+            BookTeacherDetailVC * vc = [BookTeacherDetailVC initBookTeacherDetailVC];
+            vc.Id = model.Id;
+            [self.navigationController pushViewController:vc animated:YES];
+        }
+            break;
+        case CollectModel_Organization:
+        {
+            
+        }
+            break;
+        default:
+        {
+            MyTDTopicDetailVC * vc = [MyTDTopicDetailVC initMyTDTopicDetailVC];
+            vc.type = (CollectModelType)model.MediaType;
+            vc.Id = model.Id;
+            [self.navigationController pushViewController:vc animated:YES];
+        }
+            break;
+    }
+}
+@end

+ 17 - 0
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSearch/BookMingSearchVC.h

@@ -0,0 +1,17 @@
+//
+//  BookMingSearchVC.h
+//  smartRhino
+//
+//  Created by niuzhen on 2020/2/26.
+//  Copyright © 2020 tederen. All rights reserved.
+//
+
+#import "SearchBaseVC.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface BookMingSearchVC : SearchBaseVC
+@property (nonatomic,assign) NSInteger  Id;
+@end
+
+NS_ASSUME_NONNULL_END

+ 124 - 0
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSearch/BookMingSearchVC.m

@@ -0,0 +1,124 @@
+//
+//  BookMingSearchVC.m
+//  smartRhino
+//
+//  Created by niuzhen on 2020/2/26.
+//  Copyright © 2020 tederen. All rights reserved.
+//
+
+#import "BookMingSearchVC.h"
+#import "BookMingCell.h"
+#import "HomeSubItemModel.h"
+#import "BookMingDetailVC.h"
+
+@interface BookMingSearchVC ()<UITableViewDelegate,UITableViewDataSource>
+@property (nonatomic, assign) NSUInteger  currentPage;
+@property (nonatomic, assign) NSUInteger  Total;
+@property (nonatomic, strong) NSMutableArray  *dataArray;
+
+@end
+
+@implementation BookMingSearchVC
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    self.fd_prefersNavigationBarHidden = YES;
+    self.view.backgroundColor = RGB(255, 255, 255);
+    self.tableView.delegate = self;
+    self.tableView.dataSource = self;
+    self.historySearchType = HistorySearchType_BookMing;
+    [self addObserver:self forKeyPath:@"searchText" options:NSKeyValueObservingOptionNew context:nil];
+}
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
+{
+    id obj = [change objectForKey:@"new"];
+    NSString * text = @"";
+    if ([obj isKindOfClass:[NSString class]]) {
+        text = obj;
+    }else{
+        text  = [obj stringValue];
+    }
+    if (text.length > 0) {
+        [self headRefresh];
+    }
+}
+- (NSMutableArray *)dataArray
+{
+    if (!_dataArray) {
+        _dataArray = [NSMutableArray array];
+    }
+    return _dataArray;
+}
+#pragma mark - UItableView刷新
+- (void)setTableViewRefresh{
+    WeakSelf(self)
+    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
+        [weakself headRefresh];
+    }];
+    self.tableView.mj_footer = [MJRefreshBackStateFooter footerWithRefreshingBlock:^{
+        [weakself footerRefresh];
+    }];
+    [self.tableView.mj_header beginRefreshing];
+}
+
+- (void)headRefresh{
+    self.currentPage = 1;
+    self.Total = 0;
+    [self.dataArray removeAllObjects];
+    [self getData];
+    [self.tableView.mj_header endRefreshing];
+}
+
+- (void)footerRefresh{
+    self.currentPage += 1;
+    if (self.Total == self.dataArray.count) {
+        self.currentPage --;
+        [self.tableView.mj_footer resetNoMoreData];
+        return;
+    }
+    [self.tableView.mj_footer endRefreshing];
+}
+- (void)getData
+{
+    WS(weakSelf);
+    [[HttpManager sharedHttpManager] POSTUrl:Host(API_APP_PAGE_Attach_List) parameters:@{@"LableId":@(self.Id),@"page":@(self.currentPage),@"PerPage":@20} responseStyle:JOSN success:^(id  _Nonnull responseObject) {
+        NSLog(@"%@",responseObject);
+        if ([responseObject isKindOfClass:[NSDictionary class]]) {
+            for (NSDictionary * dict in responseObject[@"Items"]) {
+                HomeSubItemModel * model = [HomeSubItemModel modelWithDictionary:dict];
+                [weakSelf.dataArray addObject:model];
+            }
+        }
+        weakSelf.Total = [responseObject[@"Total"] integerValue];
+        [weakSelf.tableView.mj_header endRefreshing];
+        [weakSelf.tableView.mj_footer endRefreshing];
+        dispatch_async(dispatch_get_main_queue(), ^{
+            [weakSelf.tableView reloadData];
+        });
+    } failure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
+{
+    return self.dataArray.count;
+}
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    HomeSubItemModel * model = [self.dataArray objectAtIndex:indexPath.row];
+    BookMingCell * cell = [BookMingCell configCell:tableView indexPath:indexPath];
+    [cell setDataWithModel:model withSearchText:self.searchText];
+    return cell;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    HomeSubItemModel * model = [self.dataArray objectAtIndex:indexPath.row];
+    BookMingDetailVC * vc = [BookMingDetailVC initBookMingDetailVC];
+    vc.gzId = model.Id;
+    vc.type = model.MediaType;
+    vc.titleStr = model.Title;
+    [self.navigationController pushViewController:vc animated:YES];
+}
+@end

+ 6 - 0
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookStoreHome.m

@@ -249,6 +249,12 @@
             if ([responseObject isKindOfClass:[NSArray class]]) {
                 for (NSDictionary * dict in responseObject) {
                     HomeSubModel * model = [HomeSubModel modelWithDictionary:dict];
+                    NSMutableArray * sArray = [NSMutableArray array];
+                    for (NSDictionary * subDict in model.Items) {
+                        HomeSubItemModel * smodel = [HomeSubItemModel modelWithDictionary:subDict];
+                        [sArray addObject:smodel];
+                    }
+                    model.Items = sArray.mutableCopy;
                     [weakSelf.dataArray addObject:model];
                 }
             }

+ 1 - 1
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSubArticeVC.h

@@ -11,7 +11,7 @@
 NS_ASSUME_NONNULL_BEGIN
 
 @interface BookSubArticeVC : UIViewController
-
+@property (assign, nonatomic) NSInteger      Id;
 @end
 
 NS_ASSUME_NONNULL_END

+ 61 - 10
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSubArticeVC.m

@@ -8,10 +8,12 @@
 
 #import "BookSubArticeVC.h"
 #import "BookSubArticeCell.h"
-#import "BookMingArticeDetailVC.h"
 
 @interface BookSubArticeVC ()<UITableViewDelegate,UITableViewDataSource>
-@property (nonatomic, strong) UITableView * tableView;
+@property (nonatomic, strong) UITableView   * tableView;
+@property (nonatomic, assign) NSUInteger      currentPage;
+@property (nonatomic, assign) NSUInteger      Total;
+@property (nonatomic, strong) NSMutableArray  *dataArray;
 @end
 
 @implementation BookSubArticeVC
@@ -28,12 +30,55 @@
     }];
     [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
         make.top.mas_equalTo(lineV.mas_bottom);
-        make.left.right.mas_equalTo(self.view);
-        if (@available(iOS 11.0, *)) {
-            make.bottom.equalTo(self.view.mas_safeAreaLayoutGuideBottom).offset(-54);
-        } else {
-            make.bottom.equalTo(self.view.mas_bottom).offset(-54);
+        make.left.bottom.right.mas_equalTo(self.view);
+    }];
+    self.currentPage = 1;
+    self.Total = 0;
+    [self getData];
+    WS(weakSelf);
+    self.tableView.mj_footer = [MJRefreshBackStateFooter footerWithRefreshingBlock:^{
+        [weakSelf footerRefresh];
+    }];
+}
+- (void)footerRefresh{
+    self.currentPage += 1;
+    if (self.Total == self.dataArray.count) {
+        self.currentPage --;
+        [self.tableView.mj_footer resetNoMoreData];
+        return;
+    }
+    [self.tableView.mj_footer endRefreshing];
+}
+- (NSMutableArray *)dataArray
+{
+    if (!_dataArray) {
+        _dataArray = [NSMutableArray array];
+    }
+    return _dataArray;
+}
+- (void)getData
+{
+    WS(weakSelf);
+    NSDictionary * paraDict = @{@"AttachId":@(self.Id),
+                                @"MediaType":@(MediaMediaArticeType),
+                                @"page":@(self.currentPage),
+                                @"PerPage":@20
+    };
+    [[HttpManager sharedHttpManager] POSTUrl:Host(API_APP_Media_Attach) parameters:paraDict responseStyle:JOSN success:^(id  _Nonnull responseObject) {
+        NSLog(@"%@",responseObject);
+        if ([responseObject isKindOfClass:[NSDictionary class]]) {
+            for (NSDictionary * dict in responseObject[@"Items"]) {
+                HomeSubItemModel * model = [HomeSubItemModel modelWithDictionary:dict];
+                [weakSelf.dataArray addObject:model];
+            }
         }
+        [weakSelf.tableView.mj_footer endRefreshing];
+        weakSelf.Total = [responseObject[@"Total"] integerValue];
+        dispatch_async(dispatch_get_main_queue(), ^{
+            [weakSelf.tableView reloadData];
+        });
+    } failure:^(NSError * _Nonnull error) {
+        
     }];
 }
 - (UITableView *)tableView
@@ -48,22 +93,28 @@
 }
 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 {
-    return 20;
+    return self.dataArray.count;
 }
 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
 {
     return UITableViewAutomaticDimension;
 }
+
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
+    HomeSubItemModel * model = [self.dataArray objectAtIndex:indexPath.row];
     BookSubArticeCell * cell = [BookSubArticeCell configCell:tableView indexPath:indexPath];
-    [cell setData];
+    [cell setDataWithModel:model];
     return cell;
 }
+
 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 {
     [tableView deselectRowAtIndexPath:indexPath animated:YES];
-    BookMingArticeDetailVC * vc = [BookMingArticeDetailVC initBookMingArticeDetailVC];
+    HomeSubItemModel * model = [self.dataArray objectAtIndex:indexPath.row];
+    MyTDTopicDetailVC * vc = [MyTDTopicDetailVC initMyTDTopicDetailVC];
+    vc.Id = model.Id;
+    vc.type = model.MediaType;
     [self.navigationController pushViewController:vc animated:YES];
 }
 @end

+ 0 - 0
smartRhino/Project/VCModel/Home/VC/BookStore/VC/BookSubMusicVC.h


Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů