├── DYKitDemo ├── Assets.xcassets │ ├── Contents.json │ ├── head.imageset │ │ ├── head@2x.png │ │ ├── head@3x.png │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── module │ ├── model │ │ ├── User.m │ │ └── User.h │ ├── view │ │ ├── BlueTableViewCell.h │ │ ├── OneTypeCellByClassTableViewCell.h │ │ ├── CellWithButtonByNibTableViewCell.h │ │ ├── OneTypeCellByNibTableViewCell.h │ │ ├── BlueTableViewCell.m │ │ ├── OneTypeCellByNibTableViewCell.m │ │ ├── CellWithButtonByNibTableViewCell.m │ │ ├── OneTypeCellByClassTableViewCell.m │ │ ├── CellWithButtonByNibTableViewCell.xib │ │ └── OneTypeCellByNibTableViewCell.xib │ └── controller │ │ ├── DataSlotViewController.h │ │ ├── SectionsViewController.h │ │ ├── CellWithRowViewController.h │ │ ├── EditActionsViewController.h │ │ ├── OneTypeCellViewController.h │ │ ├── CellWithSectionViewController.h │ │ ├── DataSlotForHeightViewController.h │ │ ├── CellWithSectionAndRowViewController.h │ │ ├── DataSlotViewController.m │ │ ├── SectionsViewController.m │ │ ├── CellWithRowViewController.m │ │ ├── OneTypeCellViewController.m │ │ ├── EditActionsViewController.m │ │ ├── CellWithSectionAndRowViewController.m │ │ ├── DataSlotViewController.xib │ │ ├── SectionsViewController.xib │ │ ├── CellWithRowViewController.xib │ │ ├── EditActionsViewController.xib │ │ ├── OneTypeCellViewController.xib │ │ ├── CellWithSectionViewController.xib │ │ ├── DataSlotForHeightViewController.xib │ │ ├── CellWithSectionAndRowViewController.xib │ │ ├── DataSlotForHeightViewController.m │ │ └── CellWithSectionViewController.m ├── ViewController.h ├── AppDelegate.h ├── main.m ├── Info.plist ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── AppDelegate.m └── ViewController.m ├── DYKit ├── DYKit.h ├── DYTableViewModule.m ├── DYTableViewRowAction.m ├── DYTableViewRowAction.h ├── DYTableViewModule.h ├── DYMacro.h ├── UITableView+DYTableViewBinder.h ├── DYTableViewAgent.h ├── UITableView+DYTableViewBinder.m └── DYTableViewAgent.m ├── DYKitDemo.xcodeproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── project.pbxproj ├── DYKitDemo.xcworkspace └── contents.xcworkspacedata ├── Podfile ├── Podfile.lock ├── DYKit.podspec ├── DYKitDemoTests ├── Info.plist └── DYKitDemoTests.m ├── LICENSE ├── .gitignore └── README.md /DYKitDemo/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /DYKitDemo/Assets.xcassets/head.imageset/head@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jyo2206208/DYKit/HEAD/DYKitDemo/Assets.xcassets/head.imageset/head@2x.png -------------------------------------------------------------------------------- /DYKitDemo/Assets.xcassets/head.imageset/head@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jyo2206208/DYKit/HEAD/DYKitDemo/Assets.xcassets/head.imageset/head@3x.png -------------------------------------------------------------------------------- /DYKit/DYKit.h: -------------------------------------------------------------------------------- 1 | // 2 | // DYKit.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/11. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "UITableView+DYTableViewBinder.h" 10 | -------------------------------------------------------------------------------- /DYKitDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /DYKitDemo/module/model/User.m: -------------------------------------------------------------------------------- 1 | // 2 | // User.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/9. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "User.h" 10 | 11 | @implementation User 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /DYKitDemo/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/8. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /DYKitDemo/module/view/BlueTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // BlueTableViewCell.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/9. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface BlueTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /DYKitDemo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/DataSlotViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // DataSlotViewController.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/25. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface DataSlotViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/SectionsViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SectionsViewController.h 3 | // DYKitDemo 4 | // 5 | // Created by farfetch on 2017/9/11. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SectionsViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/CellWithRowViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // CellWithRowViewController.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/20. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface CellWithRowViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/EditActionsViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // EditActionsViewController.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/9/6. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface EditActionsViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/OneTypeCellViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // OneTypeCellViewController.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/20. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface OneTypeCellViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /DYKitDemo/module/view/OneTypeCellByClassTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // OneTypeCellByClassTableViewCell.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/9. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface OneTypeCellByClassTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/CellWithSectionViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // CellWithSectionViewController.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/20. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface CellWithSectionViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/DataSlotForHeightViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // DataSlotForHeightViewController.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/8/16. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface DataSlotForHeightViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /DYKitDemo/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/8. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/CellWithSectionAndRowViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // CellWithSectionAndRowViewController.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/20. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface CellWithSectionAndRowViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /DYKitDemo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/8. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /DYKitDemo/module/view/CellWithButtonByNibTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // CellWithButtonByNibTableViewCell.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/9. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface CellWithButtonByNibTableViewCell : UITableViewCell 12 | @property (weak, nonatomic) IBOutlet UIButton *addButton; 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /DYKit/DYTableViewModule.m: -------------------------------------------------------------------------------- 1 | // 2 | // DYTableViewModule.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/8/16. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "DYTableViewModule.h" 10 | 11 | @implementation DYTableViewModule 12 | 13 | - (void)setEditActions:(NSArray *)editActions{ 14 | _editing = YES; 15 | _editActions = editActions; 16 | } 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /DYKitDemo/Assets.xcassets/head.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "head@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "head@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | platform :ios, '8.0' 3 | 4 | target 'DYKitDemo' do 5 | # Uncomment the next line if you're using Swift or would like to use dynamic frameworks 6 | # use_frameworks! 7 | 8 | # Pods for DYKitDemo 9 | pod 'ReactiveObjC' 10 | pod 'MLeaksFinder', :inhibit_warnings => true 11 | 12 | target 'DYKitDemoTests' do 13 | inherit! :search_paths 14 | # Pods for testing 15 | end 16 | 17 | end 18 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - FBRetainCycleDetector (0.1.3) 3 | - MLeaksFinder (0.2.1): 4 | - FBRetainCycleDetector 5 | - ReactiveObjC (3.0.0) 6 | 7 | DEPENDENCIES: 8 | - MLeaksFinder 9 | - ReactiveObjC 10 | 11 | SPEC CHECKSUMS: 12 | FBRetainCycleDetector: f0c7b290bf48ae77f6ae060843ce34ae341781eb 13 | MLeaksFinder: 0850e2f2abc7227adc4d4e2d1992b431264eb4d5 14 | ReactiveObjC: ce79989e8684b9086b5f8d0c74bc7b81a8729c9e 15 | 16 | PODFILE CHECKSUM: d546f13f20fd10121b1b33f0cf519399c8849bb7 17 | 18 | COCOAPODS: 1.3.1 19 | -------------------------------------------------------------------------------- /DYKitDemo/module/model/User.h: -------------------------------------------------------------------------------- 1 | // 2 | // User.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/9. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface User : NSObject 12 | 13 | @property (nonatomic, copy) NSString *id; 14 | @property (nonatomic, copy) NSString *name; 15 | @property (nonatomic, copy) NSString *img; 16 | @property (nonatomic, copy) NSString *age; 17 | @property (nonatomic, copy) NSString *desc; 18 | @property (nonatomic) int sex; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /DYKitDemo/module/view/OneTypeCellByNibTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // OneTypeCellByNibTableViewCell.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/9. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface OneTypeCellByNibTableViewCell : UITableViewCell 12 | @property (weak, nonatomic) IBOutlet UIImageView *headImageView; 13 | @property (weak, nonatomic) IBOutlet UILabel *nameLabel; 14 | @property (weak, nonatomic) IBOutlet UILabel *descLabel; 15 | @property (weak, nonatomic) IBOutlet UILabel *ageLabel; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /DYKitDemo/module/view/BlueTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // BlueTableViewCell.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/9. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "BlueTableViewCell.h" 10 | 11 | @implementation BlueTableViewCell 12 | 13 | - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 14 | { 15 | if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { 16 | self.contentView.backgroundColor = [UIColor blueColor]; 17 | } 18 | return self; 19 | } 20 | @end 21 | -------------------------------------------------------------------------------- /DYKitDemo/module/view/OneTypeCellByNibTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // OneTypeCellByNibTableViewCell.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/9. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "OneTypeCellByNibTableViewCell.h" 10 | 11 | @implementation OneTypeCellByNibTableViewCell 12 | 13 | - (void)awakeFromNib { 14 | [super awakeFromNib]; 15 | // Initialization code 16 | } 17 | 18 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated { 19 | [super setSelected:selected animated:animated]; 20 | 21 | // Configure the view for the selected state 22 | } 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /DYKitDemo/module/view/CellWithButtonByNibTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // CellWithButtonByNibTableViewCell.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/9. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "CellWithButtonByNibTableViewCell.h" 10 | 11 | @implementation CellWithButtonByNibTableViewCell 12 | 13 | - (void)awakeFromNib { 14 | [super awakeFromNib]; 15 | // Initialization code 16 | } 17 | 18 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated { 19 | [super setSelected:selected animated:animated]; 20 | 21 | // Configure the view for the selected state 22 | } 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /DYKitDemo/module/view/OneTypeCellByClassTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // OneTypeCellByClassTableViewCell.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/9. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "OneTypeCellByClassTableViewCell.h" 10 | 11 | @implementation OneTypeCellByClassTableViewCell 12 | 13 | - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 14 | { 15 | if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { 16 | self.contentView.backgroundColor = [UIColor yellowColor]; 17 | } 18 | return self; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /DYKit.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | s.name = "DYKit" 4 | s.version = "1.0.1" 5 | s.summary = "DYKit easyUse UITableView block reactiveCocoa" 6 | s.description = <<-DESC 7 | DYKit easyUse UITableView block reactiveCocoa reactiveObjC 8 | DESC 9 | s.homepage = "https://github.com/jyo2206208/DYKit" 10 | s.license = { :type => "MIT", :file => "LICENSE" } 11 | s.author = { "shaggon" => "715135546@qq.com" } 12 | s.ios.deployment_target = "8.0" 13 | s.source = { :git => "https://github.com/jyo2206208/DYKit.git", :tag => "#{s.version}" } 14 | s.source_files = "DYKit/*.{h,m}" 15 | s.dependency "ReactiveObjC" 16 | 17 | end 18 | -------------------------------------------------------------------------------- /DYKit/DYTableViewRowAction.m: -------------------------------------------------------------------------------- 1 | // 2 | // DYTableViewRowAction.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/9/8. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "DYTableViewRowAction.h" 10 | 11 | @implementation DYTableViewRowAction 12 | 13 | + (instancetype)rowActionWithStyle:(UITableViewRowActionStyle)style title:(nullable NSString *)title handler:(nullable void (^)(UITableViewRowAction * action, id model , NSIndexPath * indexPath))handler{ 14 | DYTableViewRowAction *tableViewAction = [[DYTableViewRowAction alloc] init]; 15 | tableViewAction.style = style; 16 | tableViewAction.title = title; 17 | tableViewAction.handler = handler; 18 | return tableViewAction; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /DYKitDemoTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /DYKit/DYTableViewRowAction.h: -------------------------------------------------------------------------------- 1 | // 2 | // DYTableViewRowAction.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/9/8. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface DYTableViewRowAction : NSObject 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | @property (nonatomic) UITableViewRowActionStyle style; 15 | @property (nonatomic, copy, nullable) NSString *title; 16 | @property (nonatomic, copy, nullable) void (^ handler)(UITableViewRowAction * action, id model , NSIndexPath * indexPath); 17 | 18 | + (instancetype)rowActionWithStyle:(UITableViewRowActionStyle)style title:(nullable NSString *)title handler:(nullable void (^)(UITableViewRowAction * action, id model , NSIndexPath * indexPath))handler; 19 | 20 | NS_ASSUME_NONNULL_END 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /DYKitDemoTests/DYKitDemoTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // DYKitDemoTests.m 3 | // DYKitDemoTests 4 | // 5 | // Created by DuYe on 2017/7/8. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "ReactiveObjC.h" 11 | 12 | @interface DYKitDemoTests : XCTestCase 13 | 14 | @end 15 | 16 | @implementation DYKitDemoTests 17 | 18 | - (void)setUp { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown { 24 | // Put teardown code here. This method is called after the invocation of each test method in the class. 25 | [super tearDown]; 26 | } 27 | 28 | - (void)testExample { 29 | 30 | } 31 | 32 | - (void)testPerformanceExample { 33 | // This is an example of a performance test case. 34 | [self measureBlock:^{ 35 | // Put the code you want to measure the time of here. 36 | }]; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /DYKit/DYTableViewModule.h: -------------------------------------------------------------------------------- 1 | // 2 | // DYTableViewModule.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/8/16. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "DYMacro.h" 11 | #import "DYTableViewRowAction.h" 12 | 13 | @interface DYTableViewModule : NSObject 14 | 15 | typedef void(^AssemblyBlock)(id cell,id model,NSIndexPath *indexPath); 16 | typedef BOOL(^SlotBlock)(NSIndexPath *indexPath, id model); 17 | 18 | @property (nonatomic, copy) NSString *reuseIdentifier; 19 | @property (nonatomic, copy) SlotBlock slotBlock; 20 | @property (nonatomic, copy) AssemblyBlock assemblyBlock; 21 | 22 | @property (nonatomic) CGFloat rowHeight; 23 | @property (nonatomic) CGFloat estimatedHeight; 24 | @property (nonatomic, copy) NSArray * editActions; 25 | @property (nonatomic) BOOL shouldShowMenu; 26 | @property (nonatomic) UITableViewCellEditingStyle editingStyle; 27 | //@property (nonatomic, copy) NSString *titleForDeleteConfirmationButton; 28 | @property (nonatomic) NSInteger indentationLevel; 29 | 30 | @property (nonatomic) BOOL editing; 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 duye 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/DataSlotViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // DataSlotViewController.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/25. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "DataSlotViewController.h" 10 | #import "DYKit.h" 11 | 12 | @interface DataSlotViewController () 13 | @property (weak, nonatomic) IBOutlet UITableView *tableView; 14 | 15 | @end 16 | 17 | @implementation DataSlotViewController 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | 22 | 23 | [self.tableView assembly:^(UITableViewCell *cell, NSString *text, NSIndexPath *indexPath) { 24 | cell.textLabel.text = text; 25 | }]; 26 | 27 | [self.tableView assembly:^(UITableViewCell *cell, NSString *text, NSIndexPath *indexPath) { 28 | cell.textLabel.text = [text stringByAppendingString:@" 长度不达3的有这段文字"]; 29 | cell.backgroundColor = [UIColor yellowColor]; 30 | } fromSlot:^BOOL(NSIndexPath *indexPath, NSString *text) { 31 | return text.length < 3; 32 | }]; 33 | 34 | 35 | RAC(self,tableView.data) = [RACSignal return:@[@"0",@"01",@"012",@"0123",@"01234",@"a",@"bb",@"ccc",@"dddd"]]; 36 | 37 | 38 | } 39 | 40 | 41 | 42 | @end 43 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/SectionsViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // SectionsViewController.m 3 | // DYKitDemo 4 | // 5 | // Created by farfetch on 2017/9/11. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "SectionsViewController.h" 10 | #import "DYKit.h" 11 | 12 | @interface SectionsViewController () 13 | @property (weak, nonatomic) IBOutlet UITableView *tableView; 14 | 15 | @end 16 | 17 | @implementation SectionsViewController 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | 22 | [self.tableView assembly:^(UITableViewCell *cell, NSString *text, NSIndexPath *indexPath) { 23 | cell.textLabel.text = text; 24 | }]; 25 | 26 | [[[self.tableView setSectionData:^NSArray *(NSDictionary *model, NSInteger section) { 27 | return model[@"data"]; 28 | }] setTitleForHeaderInSection:^NSString *(UITableView *tableView, NSInteger section) { 29 | return [NSString stringWithFormat:@"这是第%ld个section", (long)section]; 30 | }] setSectionHeaderHeight:30]; 31 | 32 | 33 | 34 | self.tableView.data = @[@{@"name":@"港台明星",@"data":@[@"刘德华",@"张学友",@"黎明",@"郭富城",@"蔡康永"]}, 35 | @{@"name":@"大陆明星",@"data":@[@"薛之谦",@"杨幂",@"王宝强",@"黄渤"]}, 36 | @{@"name":@"动漫明星",@"data":@[@"机器猫",@"大熊",@"(●—●)",@"美少女战士",@"孙悟空",@"贝吉塔"]}, 37 | ]; 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/CellWithRowViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // CellWithRowViewController.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/20. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "CellWithRowViewController.h" 10 | #import "BlueTableViewCell.h" 11 | #import "DYKit.h" 12 | 13 | @interface CellWithRowViewController () 14 | @property (weak, nonatomic) IBOutlet UITableView *tableView; 15 | 16 | @end 17 | 18 | @implementation CellWithRowViewController 19 | 20 | - (void)viewDidLoad { 21 | [super viewDidLoad]; 22 | 23 | [self.tableView setHeightForRowAtIndexPath:^CGFloat(UITableView *tableView, NSIndexPath *indexPath) { 24 | return indexPath.row == 1 ? 20 : 40; 25 | }]; 26 | 27 | [self.tableView assembly:^(UITableViewCell *cell, NSString *text, NSIndexPath *indexPath) { 28 | cell.textLabel.text = text; 29 | }]; 30 | 31 | [[self.tableView assembly:^(BlueTableViewCell *cell, NSString *text, NSIndexPath *indexPath) { 32 | cell.textLabel.text = text; 33 | } fromSlot:^BOOL(NSIndexPath *indexPath, id model) { 34 | //只有row==5的位置才使用BlueTableViewCell 35 | return indexPath.row == 5; 36 | } withPlug:BlueTableViewCell.class] setRowHeight:100]; 37 | 38 | 39 | 40 | self.tableView.data = @[@"刘德华",@"张学友",@"黎明",@"郭富城",@"郭德纲",@"郭敬明",@"黄晓明",@"柴静",@"宋祖德",@"大S",@"小S",@"欧阳娜娜",@"王力宏",@"周杰伦",@"机器猫",@"大熊",@"(●—●)",@"美少女战士",@"孙悟空",@"贝吉塔"]; 41 | } 42 | 43 | @end 44 | -------------------------------------------------------------------------------- /DYKit/DYMacro.h: -------------------------------------------------------------------------------- 1 | // 2 | // DYMacro.h 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/8/16. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #ifndef DYMacro_h 10 | #define DYMacro_h 11 | 12 | // 懒加载 13 | #define DY_LAZY(object, assignment) (object = object ?: assignment) 14 | #define DYN_LAZY(object, typeClass) -(typeClass *)object{return _##object = (_##object ?: [[typeClass alloc] init]);} 15 | 16 | // 动态添加属性(对象) 17 | #define DYSYNTH_DYNAMIC_PROPERTY_OBJECT(_getter_, _setter_, _association_, _type_) \ 18 | - (void)_setter_ : (_type_)object { \ 19 | [self willChangeValueForKey:@#_getter_]; \ 20 | objc_setAssociatedObject(self, _cmd, object, OBJC_ASSOCIATION_ ## _association_); \ 21 | [self didChangeValueForKey:@#_getter_]; \ 22 | } \ 23 | - (_type_)_getter_ { \ 24 | return objc_getAssociatedObject(self, @selector(_setter_:)); \ 25 | } 26 | 27 | // 动态添加属性(基本数据类型) 28 | #define DYSYNTH_DYNAMIC_PROPERTY_CTYPE(_getter_, _setter_, _type_) \ 29 | - (void)_setter_ : (_type_)object { \ 30 | [self willChangeValueForKey:@#_getter_]; \ 31 | NSValue *value = [NSValue value:&object withObjCType:@encode(_type_)]; \ 32 | objc_setAssociatedObject(self, _cmd, value, OBJC_ASSOCIATION_RETAIN); \ 33 | [self didChangeValueForKey:@#_getter_]; \ 34 | } \ 35 | - (_type_)_getter_ { \ 36 | _type_ cValue = { 0 }; \ 37 | NSValue *value = objc_getAssociatedObject(self, @selector(_setter_:)); \ 38 | [value getValue:&cValue]; \ 39 | return cValue; \ 40 | } 41 | 42 | 43 | 44 | #endif /* DYMacro_h */ 45 | -------------------------------------------------------------------------------- /DYKitDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | # CocoaPods 32 | # 33 | # We recommend against adding the Pods directory to your .gitignore. However 34 | # you should judge for yourself, the pros and cons are mentioned at: 35 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 36 | # 37 | Pods/ 38 | 39 | # Carthage 40 | # 41 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 42 | # Carthage/Checkouts 43 | 44 | Carthage/Build 45 | 46 | # fastlane 47 | # 48 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 49 | # screenshots whenever they are needed. 50 | # For more information about the recommended setup visit: 51 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 52 | 53 | fastlane/report.xml 54 | fastlane/Preview.html 55 | fastlane/screenshots 56 | fastlane/test_output 57 | 58 | # Code Injection 59 | # 60 | # After new code Injection tools there's a generated folder /iOSInjectionProject 61 | # https://github.com/johnno1962/injectionforxcode 62 | 63 | iOSInjectionProject/ -------------------------------------------------------------------------------- /DYKitDemo/module/controller/OneTypeCellViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // OneTypeCellViewController.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/20. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "OneTypeCellViewController.h" 10 | #import "DYKit.h" 11 | #import "User.h" 12 | #import "OneTypeCellByNibTableViewCell.h" 13 | 14 | @interface OneTypeCellViewController () 15 | @property (weak, nonatomic) IBOutlet UITableView *tableView; 16 | 17 | @end 18 | 19 | @implementation OneTypeCellViewController 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | 24 | [self.tableView assembly:^(OneTypeCellByNibTableViewCell *cell, User *user, NSIndexPath *indexPath) { 25 | cell.headImageView.image = [UIImage imageNamed:user.img]; 26 | cell.headImageView.backgroundColor = user.sex == 0 ? [UIColor purpleColor] : [UIColor blackColor]; 27 | cell.nameLabel.text = user.name; 28 | cell.ageLabel.text = user.age; 29 | cell.descLabel.text = user.desc; 30 | } withPlug:OneTypeCellByNibTableViewCell.class]; 31 | 32 | User *user1 = [User new]; 33 | User *user2 = [User new]; 34 | User *user3 = [User new]; 35 | 36 | user1.id = @"001"; 37 | user1.name = @"jack"; 38 | user1.img = @"head"; 39 | user1.age = @"29"; 40 | user1.desc = @"她喜欢黑色"; 41 | user1.sex = 0; 42 | user2.id = @"002"; 43 | user2.name = @"Pink man"; 44 | user2.img = @"head"; 45 | user2.age = @"18"; 46 | user2.desc = @"白老师得意门生"; 47 | user2.sex = 1; 48 | user3.id = @"003"; 49 | user3.name = @"MR.white"; 50 | user3.img = @"head"; 51 | user3.age = @"43"; 52 | user3.desc = @"平淡无奇的中学化学老师"; 53 | user3.sex = 1; 54 | 55 | self.tableView.data = @[user1,user2,user3]; 56 | } 57 | 58 | @end 59 | -------------------------------------------------------------------------------- /DYKitDemo/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /DYKitDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | } 88 | ], 89 | "info" : { 90 | "version" : 1, 91 | "author" : "xcode" 92 | } 93 | } -------------------------------------------------------------------------------- /DYKitDemo/module/controller/EditActionsViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // EditActionsViewController.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/9/6. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "EditActionsViewController.h" 10 | #import "DYKit.h" 11 | 12 | @interface EditActionsViewController () 13 | @property (weak, nonatomic) IBOutlet UITableView *tableView; 14 | 15 | @end 16 | 17 | @implementation EditActionsViewController 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | 22 | DYTableViewRowAction *firstAction = [DYTableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"第一" handler:^(UITableViewRowAction * _Nonnull action, NSString *text, NSIndexPath * _Nonnull indexPath) { 23 | NSLog(@"按钮第一的数据为:%@",text); 24 | }]; 25 | 26 | DYTableViewRowAction *secondAction = [DYTableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"第二" handler:^(UITableViewRowAction * _Nonnull action, NSString *text, NSIndexPath * _Nonnull indexPath) { 27 | NSLog(@"按钮第二的数据为:%@",text); 28 | }]; 29 | 30 | 31 | [[self.tableView assembly:^(UITableViewCell *cell, NSString *text, NSIndexPath *indexPath) { 32 | cell.textLabel.text = text; 33 | } fromSlot:^BOOL(NSIndexPath *indexPath, NSString *text) { 34 | return text.length < 3; 35 | }] setEditActions:@[firstAction]]; 36 | 37 | [[self.tableView assembly:^(UITableViewCell *cell, NSString *text, NSIndexPath *indexPath) { 38 | cell.textLabel.text = text; 39 | } fromSlot:^BOOL(NSIndexPath *indexPath, NSString *text) { 40 | return text.length >= 3; 41 | }] setEditActions:@[firstAction,secondAction]]; 42 | 43 | 44 | 45 | NSArray *(^dataBlock)() = ^() { 46 | NSMutableArray *array = [[NSMutableArray alloc] init]; 47 | int count = arc4random() % 30; 48 | for (int i = 0; i < count; i++) { 49 | [array addObject:[NSString stringWithFormat:@"%i",arc4random() % 1000]]; 50 | } 51 | return array; 52 | }; 53 | 54 | self.tableView.data = dataBlock(); 55 | } 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /DYKitDemo/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/8. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | return YES; 21 | } 22 | 23 | 24 | - (void)applicationWillResignActive:(UIApplication *)application { 25 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 26 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 27 | } 28 | 29 | 30 | - (void)applicationDidEnterBackground:(UIApplication *)application { 31 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 32 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 33 | } 34 | 35 | 36 | - (void)applicationWillEnterForeground:(UIApplication *)application { 37 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 38 | } 39 | 40 | 41 | - (void)applicationDidBecomeActive:(UIApplication *)application { 42 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 43 | } 44 | 45 | 46 | - (void)applicationWillTerminate:(UIApplication *)application { 47 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 48 | } 49 | 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/CellWithSectionAndRowViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // CellWithSectionAndRowViewController.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/20. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "CellWithSectionAndRowViewController.h" 10 | #import "DYKit.h" 11 | #import "User.h" 12 | #import "OneTypeCellByNibTableViewCell.h" 13 | 14 | @interface CellWithSectionAndRowViewController () 15 | @property (weak, nonatomic) IBOutlet UITableView *tableView; 16 | 17 | @end 18 | 19 | @implementation CellWithSectionAndRowViewController 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | 24 | 25 | [self.tableView assembly:^(UITableViewCell *cell, NSString *text, NSIndexPath *indexPath) { 26 | cell.textLabel.text = text; 27 | } fromSlot:^BOOL(NSIndexPath *indexPath, id model) { 28 | return !(indexPath.section == 1 && indexPath.row == 0); 29 | }]; 30 | 31 | [self.tableView assembly:^(OneTypeCellByNibTableViewCell *cell, User *user, NSIndexPath *indexPath) { 32 | cell.headImageView.image = [UIImage imageNamed:user.img]; 33 | cell.headImageView.backgroundColor = user.sex == 0 ? [UIColor purpleColor] : [UIColor blackColor]; 34 | cell.nameLabel.text = user.name; 35 | cell.ageLabel.text = user.age; 36 | cell.descLabel.text = user.desc; 37 | } fromSlot:^BOOL(NSIndexPath *indexPath, id model) { 38 | return indexPath.section == 1 && indexPath.row == 0; 39 | } withPlug:OneTypeCellByNibTableViewCell.class]; 40 | 41 | [[[self.tableView setSectionData:^NSArray *(id model, NSInteger section) { 42 | return model; 43 | }] setTitleForHeaderInSection:^NSString *(UITableView *tableView, NSInteger section) { 44 | return [NSString stringWithFormat:@"这是第%ld个section", (long)section]; 45 | }] setSectionHeaderHeight:30]; 46 | 47 | 48 | User *user1 = [User new]; 49 | user1.id = @"001"; 50 | user1.name = @"jack"; 51 | user1.img = @"head"; 52 | user1.age = @"29"; 53 | user1.desc = @"她喜欢黑色"; 54 | user1.sex = 0; 55 | 56 | self.tableView.data = @[@[@"刘德华",@"张学友",@"黎明",@"郭富城",@"郭德纲",@"郭敬明",@"黄晓明",@"柴静",@"宋祖德",@"大S",@"小S",@"欧阳娜娜",@"王力宏",@"周杰伦"], 57 | @[user1,@"机器猫",@"大熊",@"(●—●)",@"美少女战士",@"孙悟空",@"贝吉塔"]]; 58 | 59 | } 60 | 61 | @end 62 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/DataSlotViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/SectionsViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/CellWithRowViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/EditActionsViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/OneTypeCellViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/CellWithSectionViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/DataSlotForHeightViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/CellWithSectionAndRowViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /DYKitDemo/module/view/CellWithButtonByNibTableViewCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/DataSlotForHeightViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // DataSlotForHeightViewController.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/8/16. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "DataSlotForHeightViewController.h" 10 | #import "DYKit.h" 11 | 12 | @interface DataSlotForHeightViewController () 13 | @property (weak, nonatomic) IBOutlet UITableView *tableView; 14 | 15 | @end 16 | 17 | @implementation DataSlotForHeightViewController 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | 22 | NSArray *(^dataBlock)() = ^() { 23 | NSMutableArray *array = [[NSMutableArray alloc] init]; 24 | int count = arc4random() % 30; 25 | for (int i = 0; i < count; i++) { 26 | [array addObject:[NSString stringWithFormat:@"%i",arc4random() % 1000]]; 27 | } 28 | return array; 29 | }; 30 | 31 | 32 | 33 | [self.tableView assembly:^(UITableViewCell *cell, NSString *text, NSIndexPath *indexPath) { 34 | cell.textLabel.text = text; 35 | }]; 36 | 37 | [[self.tableView assembly:^(UITableViewCell *cell, NSString *text, NSIndexPath *indexPath) { 38 | cell.textLabel.text = [text stringByAppendingString:@" 长度不达3的有这段文字"]; 39 | } fromSlot:^BOOL(NSIndexPath *indexPath, NSString *text) { 40 | return text.length < 3; 41 | }] setRowHeight:100]; 42 | 43 | self.tableView.data = dataBlock(); 44 | 45 | UIBarButtonItem *reloadItem = [[UIBarButtonItem alloc] init]; 46 | reloadItem.title = @"reload"; 47 | reloadItem.tintColor = [UIColor blueColor]; 48 | UIBarButtonItem *autoReloadItem = [[UIBarButtonItem alloc] init]; 49 | autoReloadItem.title = @"autoReload"; 50 | autoReloadItem.tintColor = [UIColor blueColor]; 51 | UIBarButtonItem *newDataItem = [[UIBarButtonItem alloc] init]; 52 | newDataItem.title = @"newData"; 53 | newDataItem.tintColor = [UIColor blueColor]; 54 | 55 | @weakify(self) 56 | newDataItem.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) { 57 | @strongify(self) 58 | self.tableView.data = dataBlock(); 59 | return [RACSignal empty]; 60 | }]; 61 | 62 | autoReloadItem.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(UIBarButtonItem *input) { 63 | @strongify(self) 64 | if ([input.tintColor isEqual:[UIColor lightGrayColor]]) { 65 | input.tintColor = [UIColor blueColor]; 66 | self.tableView.autoReload = YES; 67 | } else { 68 | input.tintColor = [UIColor lightGrayColor]; 69 | self.tableView.autoReload = NO; 70 | } 71 | return [RACSignal empty]; 72 | }]; 73 | 74 | reloadItem.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) { 75 | @strongify(self) 76 | [self.tableView reloadData]; 77 | return [RACSignal empty]; 78 | }]; 79 | self.navigationItem.rightBarButtonItems = @[reloadItem,autoReloadItem,newDataItem]; 80 | } 81 | 82 | @end 83 | -------------------------------------------------------------------------------- /DYKitDemo/module/controller/CellWithSectionViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // CellWithSectionViewController.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/20. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "CellWithSectionViewController.h" 10 | #import "DYKit.h" 11 | #import "User.h" 12 | #import "OneTypeCellByNibTableViewCell.h" 13 | #import "BlueTableViewCell.h" 14 | 15 | @interface CellWithSectionViewController () 16 | @property (weak, nonatomic) IBOutlet UITableView *tableView; 17 | 18 | @end 19 | 20 | @implementation CellWithSectionViewController 21 | 22 | - (void)viewDidLoad { 23 | [super viewDidLoad]; 24 | 25 | [self.tableView assembly:^(UITableViewCell *cell, NSString *string, NSIndexPath *indexPath) { 26 | cell.textLabel.text = string; 27 | } fromSlot:^BOOL(NSIndexPath *indexPath, id model) { 28 | return indexPath.section == 0; 29 | }]; 30 | 31 | [self.tableView assembly:^(OneTypeCellByNibTableViewCell *cell, User *user, NSIndexPath *indexPath) { 32 | cell.headImageView.image = [UIImage imageNamed:user.img]; 33 | cell.headImageView.backgroundColor = user.sex == 0 ? [UIColor purpleColor] : [UIColor blackColor]; 34 | cell.nameLabel.text = user.name; 35 | cell.ageLabel.text = user.age; 36 | cell.descLabel.text = user.desc; 37 | } fromSlot:^BOOL(NSIndexPath *indexPath, id model) { 38 | return indexPath.section == 1; 39 | } withPlug:OneTypeCellByNibTableViewCell.class]; 40 | 41 | [self.tableView assembly:^(UITableViewCell *cell, NSString *text, NSIndexPath *indexPath) { 42 | cell.textLabel.text = text; 43 | } fromSlot:^BOOL(NSIndexPath *indexPath, id model) { 44 | return indexPath.section == 2; 45 | } withPlug:BlueTableViewCell.class]; 46 | 47 | [[[[self.tableView setSectionData:^NSArray *(NSDictionary *model, NSInteger section) { 48 | return model[@"data"]; 49 | }] setTitleForHeaderInSection:^NSString *(UITableView *tableView, NSInteger section) { 50 | return [NSString stringWithFormat:@"这是第%ld个section", (long)section]; 51 | }] setHeightForRowAtIndexPath:^CGFloat(UITableView *tableView, NSIndexPath *indexPath) { 52 | return indexPath.row == 1 ? 100 : tableView.rowHeight; 53 | }] setSectionHeaderHeight:50]; 54 | 55 | 56 | User *user1 = [User new]; 57 | User *user2 = [User new]; 58 | User *user3 = [User new]; 59 | user1.id = @"001"; 60 | user1.name = @"jack"; 61 | user1.img = @"head"; 62 | user1.age = @"29"; 63 | user1.desc = @"她喜欢黑色"; 64 | user1.sex = 0; 65 | user2.id = @"002"; 66 | user2.name = @"Pink man"; 67 | user2.img = @"head"; 68 | user2.age = @"18"; 69 | user2.desc = @"白老师得意门生"; 70 | user2.sex = 1; 71 | user3.id = @"003"; 72 | user3.name = @"MR.white"; 73 | user3.img = @"head"; 74 | user3.age = @"43"; 75 | user3.desc = @"平淡无奇的中学化学老师"; 76 | user3.sex = 1; 77 | 78 | self.tableView.data = @[@{@"name":@"港台明星",@"data":@[@"刘德华",@"张学友",@"黎明",@"郭富城",@"郭德纲",@"郭敬明",@"黄晓明",@"柴静",@"宋祖德",@"大S",@"小S",@"欧阳娜娜",@"王力宏",@"周杰伦"]}, 79 | @{@"name":@"大陆明星",@"data":@[user1,user2,user3]}, 80 | @{@"name":@"动漫明星",@"data":@[@"机器猫",@"大熊",@"(●—●)",@"美少女战士",@"孙悟空",@"贝吉塔"]}, 81 | ]; 82 | 83 | } 84 | 85 | @end 86 | -------------------------------------------------------------------------------- /DYKitDemo/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /DYKitDemo/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // DYKitDemo 4 | // 5 | // Created by DuYe on 2017/7/8. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import "DYKit.h" 11 | #import "OneTypeCellViewController.h" 12 | #import "CellWithSectionAndRowViewController.h" 13 | #import "CellWithSectionViewController.h" 14 | #import "CellWithRowViewController.h" 15 | #import "DataSlotViewController.h" 16 | #import "DataSlotForHeightViewController.h" 17 | #import "EditActionsViewController.h" 18 | #import "SectionsViewController.h" 19 | 20 | @interface ViewController () 21 | @property (weak, nonatomic) IBOutlet UITableView *homeTableView; 22 | 23 | @end 24 | 25 | @implementation ViewController 26 | 27 | - (void)viewDidLoad { 28 | [super viewDidLoad]; 29 | [self homeTableViewSetUp]; 30 | } 31 | 32 | 33 | - (void)homeTableViewSetUp { 34 | 35 | [self.homeTableView assembly:^(UITableViewCell *cell, NSString *text, NSIndexPath *indexPath) { 36 | //这个block充当了cellForRowAtIndexPath的作用 37 | cell.textLabel.text = text; 38 | }]; 39 | 40 | self.homeTableView.data = @[@"固定一种自定义cell", 41 | @"指定section和row(或具体indexPath)设定cell", 42 | @"指定section进行cell设定", 43 | @"指定row进行cell设定", 44 | @"指定数据条件进行cell设定", 45 | @"指定模块进行高度设定", 46 | @"左滑出现按钮", 47 | @"多section的情况"]; 48 | 49 | @weakify(self) 50 | [[[self.homeTableView.didSelectRowAtIndexPathSignal reduceEach:^id (UITableView *tableView ,NSIndexPath *indexPath){ 51 | return @(indexPath.row); 52 | }] filter:^BOOL(id _Nullable value) { 53 | return [value intValue] == 0; 54 | }] subscribeNext:^(id _Nullable x) { 55 | @strongify(self) 56 | [self.navigationController pushViewController:[[OneTypeCellViewController alloc] init] animated:YES]; 57 | }]; 58 | 59 | [[[self.homeTableView.didSelectRowAtIndexPathSignal reduceEach:^id (UITableView *tableView ,NSIndexPath *indexPath){ 60 | return @(indexPath.row); 61 | }] filter:^BOOL(id _Nullable value) { 62 | return [value intValue] == 1; 63 | }] subscribeNext:^(id _Nullable x) { 64 | @strongify(self) 65 | [self.navigationController pushViewController:[[CellWithSectionAndRowViewController alloc] init] animated:YES]; 66 | }]; 67 | 68 | [[[self.homeTableView.didSelectRowAtIndexPathSignal reduceEach:^id (UITableView *tableView ,NSIndexPath *indexPath){ 69 | return @(indexPath.row); 70 | }] filter:^BOOL(id _Nullable value) { 71 | return [value intValue] == 2; 72 | }] subscribeNext:^(id _Nullable x) { 73 | @strongify(self) 74 | [self.navigationController pushViewController:[[CellWithSectionViewController alloc] init] animated:YES]; 75 | }]; 76 | 77 | [[[self.homeTableView.didSelectRowAtIndexPathSignal reduceEach:^id (UITableView *tableView ,NSIndexPath *indexPath){ 78 | return @(indexPath.row); 79 | }] filter:^BOOL(id _Nullable value) { 80 | return [value intValue] == 3; 81 | }] subscribeNext:^(id _Nullable x) { 82 | @strongify(self) 83 | [self.navigationController pushViewController:[[CellWithRowViewController alloc] init] animated:YES]; 84 | }]; 85 | 86 | [[[self.homeTableView.didSelectRowAtIndexPathSignal reduceEach:^id (UITableView *tableView ,NSIndexPath *indexPath){ 87 | return @(indexPath.row); 88 | }] filter:^BOOL(id _Nullable value) { 89 | return [value intValue] == 4; 90 | }] subscribeNext:^(id _Nullable x) { 91 | @strongify(self) 92 | [self.navigationController pushViewController:[[DataSlotViewController alloc] init] animated:YES]; 93 | }]; 94 | 95 | [[[self.homeTableView.didSelectRowAtIndexPathSignal reduceEach:^id (UITableView *tableView ,NSIndexPath *indexPath){ 96 | return @(indexPath.row); 97 | }] filter:^BOOL(id _Nullable value) { 98 | return [value intValue] == 5; 99 | }] subscribeNext:^(id _Nullable x) { 100 | @strongify(self) 101 | [self.navigationController pushViewController:[[DataSlotForHeightViewController alloc] init] animated:YES]; 102 | }]; 103 | 104 | [[[self.homeTableView.didSelectRowAtIndexPathSignal reduceEach:^id (UITableView *tableView ,NSIndexPath *indexPath){ 105 | return @(indexPath.row); 106 | }] filter:^BOOL(id _Nullable value) { 107 | return [value intValue] == 6; 108 | }] subscribeNext:^(id _Nullable x) { 109 | @strongify(self) 110 | [self.navigationController pushViewController:[[EditActionsViewController alloc] init] animated:YES]; 111 | }]; 112 | 113 | [[[self.homeTableView.didSelectRowAtIndexPathSignal reduceEach:^id (UITableView *tableView ,NSIndexPath *indexPath){ 114 | return @(indexPath.row); 115 | }] filter:^BOOL(id _Nullable value) { 116 | return [value intValue] == 7; 117 | }] subscribeNext:^(id _Nullable x) { 118 | @strongify(self) 119 | [self.navigationController pushViewController:[[SectionsViewController alloc] init] animated:YES]; 120 | }]; 121 | 122 | } 123 | @end 124 | -------------------------------------------------------------------------------- /DYKit/UITableView+DYTableViewBinder.h: -------------------------------------------------------------------------------- 1 | // 2 | // UITableView+DYTableViewBinder.h 3 | // DYMVVMRAC 4 | // 5 | // Created by DuYe on 2017/6/30. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "DYTableViewAgent.h" 11 | #import "objc/runtime.h" 12 | #import "DYTableViewRowAction.h" 13 | 14 | @interface UITableView (DYTableViewBinder) 15 | 16 | #pragma 属性 17 | 18 | /** 19 | 隐形代理 20 | */ 21 | @property (nonatomic, strong) DYTableViewAgent *agent; 22 | 23 | /** 24 | 是否在给data赋值后自动执行reload 25 | */ 26 | @property (nonatomic) BOOL autoReload; 27 | 28 | - (NSArray *)data; 29 | - (void)setData:(NSArray *)data; 30 | 31 | - (UITableView*)setSectionData:(GetSectionData)block; 32 | 33 | #pragma 主要装配方法 34 | /** 35 | 所有cell为UItableViewCell 36 | 37 | @param block 装配用block 38 | @return 模块本体,可在返回后继续链式调用配置 39 | */ 40 | - (DYTableViewModule*) assembly:(AssemblyBlock)block; 41 | 42 | /** 43 | 所有cell为参数plug所指的cell 44 | 45 | @param block 装配用block 46 | @param plug 装配用cell类型 47 | @return 模块本体,可在返回后继续链式调用配置 48 | */ 49 | - (DYTableViewModule*) assembly:(AssemblyBlock)block withPlug:(Class)plug; 50 | 51 | /** 52 | 满足slotBlock条件的位置装配UItableViewCell 53 | 54 | @param assemblyBlock 装配用block 55 | @param slotBlock 装配条件block 56 | @return 模块本体,可在返回后继续链式调用配置 57 | */ 58 | - (DYTableViewModule*) assembly:(AssemblyBlock)assemblyBlock fromSlot:(SlotBlock)slotBlock; 59 | 60 | /** 61 | 满足slotBlock条件的位置装配参数plug所指的cell 62 | 63 | @param assemblyBlock 装配用block 64 | @param slotBlock 装配条件block 65 | @param plug 装配用cell类型 66 | @return 模块本体,可在返回后继续链式调用配置 67 | */ 68 | - (DYTableViewModule*) assembly:(AssemblyBlock)assemblyBlock fromSlot:(SlotBlock)slotBlock withPlug:(Class)plug; 69 | 70 | 71 | #pragma 配置用block 72 | - (UITableView*)setHeightForRowAtIndexPath:(CGFloatTableViewIndexPath)block; 73 | - (UITableView*)setEditActionsForRowAtIndexPath:(EditActionsForRowAtIndexPath)block; 74 | - (UITableView*)setShouldHighlightRowAtIndexPath:(BOOLTableViewIndexPath)block; 75 | - (UITableView*)setCanEditRowAtIndexPath:(BOOLTableViewIndexPath)block; 76 | - (UITableView*)setNumberOfRowsInSection:(NSIntegerTableViewIndexPath)block; 77 | //- (void)setCellForRowAtIndexPath:(UITableViewCellTableViewIndexPath)block; 78 | - (UITableView*)setNumberOfSectionsInTableView:(NSIntegerUITableView)block; 79 | - (UITableView*)setTitleForHeaderInSection:(NSStringTableViewNSInteger)block; 80 | - (UITableView*)setTitleForFooterInSection:(NSStringTableViewNSInteger)block; 81 | - (UITableView*)setCanMoveRowAtIndexPath:(BOOLTableViewIndexPath)block; 82 | - (UITableView*)setSectionIndexTitlesForTableView:(SectionIndexTitlesForTableView)block; 83 | - (UITableView*)setSectionForSectionIndexTitle:(NSIntegerUITableViewNSStringNSInteger)block; 84 | - (UITableView*)setHeightForHeaderInSection:(CGFloatTableViewNSInteger)block; 85 | - (UITableView*)setHeightForFooterInSection:(CGFloatTableViewNSInteger)block; 86 | - (UITableView*)setEstimatedHeightForRowAtIndexPath:(CGFloatTableViewIndexPath)block; 87 | - (UITableView*)setEstimatedHeightForHeaderInSection:(CGFloatTableViewNSInteger)block; 88 | - (UITableView*)setEstimatedHeightForFooterInSection:(CGFloatTableViewNSInteger)block; 89 | - (UITableView*)setViewForHeaderInSection:(UIViewTableViewNSInteger)block; 90 | - (UITableView*)setViewForFooterInSection:(UIViewTableViewNSInteger)block; 91 | - (UITableView*)setWillSelectRowAtIndexPath:(NSIndexPathUITableViewNSIndexPath)block; 92 | - (UITableView*)setWillDeselectRowAtIndexPath:(NSIndexPathUITableViewNSIndexPath)block; 93 | - (UITableView*)setEditingStyleForRowAtIndexPath:(UITableViewCellEditingStyleUITableViewNSIndexPath)block; 94 | //- (UITableView*)setTitleForDeleteConfirmationButtonForRowAtIndexPath:(NSStringTableViewIndexPath)block; 95 | - (UITableView*)setShouldIndentWhileEditingRowAtIndexPath:(BOOLTableViewIndexPath)block; 96 | - (UITableView*)setTargetIndexPathForMoveFromRowAtIndexPath:(NSIndexPathUITableViewNSIndexPathNSIndexPath)block; 97 | - (UITableView*)setIndentationLevelForRowAtIndexPath:(NSIntegerUITableViewNSIndexPath)block; 98 | - (UITableView*)setShouldShowMenuForRowAtIndexPath:(BOOLTableViewIndexPath)block; 99 | - (UITableView*)setCanPerformAction:(BOOLUITableViewSELNSIndexPath)block; 100 | - (UITableView*)setCanFocusRowAtIndexPath:(BOOLTableViewIndexPath)block; 101 | - (UITableView*)setShouldUpdateFocusInContext:(BOOLUITableViewFocusUpdateContext)block; 102 | - (UITableView*)setIndexPathForPreferredFocusedViewInTableView:(NSIndexPathUITableView)block; 103 | 104 | #pragma delegate方法 105 | - (RACSignal*)accessoryButtonTappedForRowWithIndexPathSignal; 106 | - (RACSignal*)didEndDisplayingCellSignal; 107 | - (RACSignal*)didEndDisplayingHeaderViewSignal; 108 | - (RACSignal*)didEndDisplayingFooterViewSignal; 109 | - (RACSignal*)didHighlightRowAtIndexPathSignal; 110 | - (RACSignal*)didUnhighlightRowAtIndexPathSignal; 111 | - (RACSignal*)didSelectRowAtIndexPathSignal; 112 | - (RACSignal*)didDeselectRowAtIndexPathSignal; 113 | - (RACSignal*)didEndEditingRowAtIndexPathSignal; 114 | - (RACSignal*)didUpdateFocusInContextSignal; 115 | - (RACSignal*)performActionSignal; 116 | - (RACSignal*)willBeginEditingRowAtIndexPathSignal; 117 | - (RACSignal*)willDisplayCellSignal; 118 | - (RACSignal*)willDisplayHeaderViewSignal; 119 | - (RACSignal*)willDisplayFooterViewSignal; 120 | 121 | #pragma DataSource方法 122 | - (RACSignal*)commitEditingStyleSignal; 123 | - (RACSignal*)moveRowAtIndexPathSignal; 124 | 125 | 126 | 127 | @end 128 | -------------------------------------------------------------------------------- /DYKit/DYTableViewAgent.h: -------------------------------------------------------------------------------- 1 | // 2 | // DYTableViewDataSouce.h 3 | // DYMVVMRAC 4 | // 5 | // Created by DuYe on 2017/7/7. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "DYTableViewModule.h" 11 | 12 | #if __has_include("ReactiveCocoa.h") 13 | #import "ReactiveCocoa.h" 14 | #else 15 | #import 16 | #endif 17 | 18 | @interface DYTableViewAgent : NSObject 19 | 20 | @property (nonatomic, copy) NSArray *data; 21 | @property (nonatomic, strong) NSMutableArray *tableModuleLists; 22 | @property (nonatomic, strong) DYTableViewModule *defaultTableModule; 23 | 24 | typedef NSArray* (^GetSectionData)(id model,NSInteger section); 25 | @property (nonatomic, copy) GetSectionData getSectionData; 26 | 27 | 28 | #pragma 下面是自带的配置 29 | typedef CGFloat (^CGFloatTableViewIndexPath)(UITableView *tableView,NSIndexPath *indexPath); 30 | @property (nonatomic, copy) CGFloatTableViewIndexPath heightForRowAtIndexPath; 31 | @property (nonatomic, copy) CGFloatTableViewIndexPath estimatedHeightForRowAtIndexPath; 32 | 33 | typedef CGFloat (^CGFloatTableViewNSInteger)(UITableView *tableView,NSInteger section); 34 | @property (nonatomic, copy) CGFloatTableViewNSInteger heightForHeaderInSection; 35 | @property (nonatomic, copy) CGFloatTableViewNSInteger heightForFooterInSection; 36 | @property (nonatomic, copy) CGFloatTableViewNSInteger estimatedHeightForHeaderInSection; 37 | @property (nonatomic, copy) CGFloatTableViewNSInteger estimatedHeightForFooterInSection; 38 | 39 | typedef NSArray *(^EditActionsForRowAtIndexPath)(UITableView *tableView,NSIndexPath *indexPath); 40 | @property (nonatomic, copy) EditActionsForRowAtIndexPath editActionsForRowAtIndexPath; 41 | 42 | typedef BOOL (^BOOLTableViewIndexPath)(UITableView *tableView,NSIndexPath *indexPath); 43 | @property (nonatomic, copy) BOOLTableViewIndexPath shouldHighlightRowAtIndexPath; 44 | @property (nonatomic, copy) BOOLTableViewIndexPath canEditRowAtIndexPath; 45 | @property (nonatomic, copy) BOOLTableViewIndexPath shouldIndentWhileEditingRowAtIndexPath; 46 | @property (nonatomic, copy) BOOLTableViewIndexPath shouldShowMenuForRowAtIndexPath; 47 | @property (nonatomic, copy) BOOLTableViewIndexPath canFocusRowAtIndexPath; 48 | 49 | typedef NSInteger (^NSIntegerTableViewIndexPath)(UITableView *tableView,NSInteger section); 50 | @property (nonatomic, copy) NSIntegerTableViewIndexPath numberOfRowsInSection; 51 | 52 | //typedef UITableViewCell *(^UITableViewCellTableViewIndexPath)(UITableView *tableView,NSIndexPath *indexPath); 53 | //@property (nonatomic, copy) UITableViewCellTableViewIndexPath cellForRowAtIndexPath; 54 | 55 | typedef NSInteger (^NSIntegerUITableView)(UITableView *tableView); 56 | @property (nonatomic, copy) NSIntegerUITableView numberOfSectionsInTableView; 57 | 58 | typedef NSString *(^NSStringTableViewNSInteger)(UITableView *tableView,NSInteger section); 59 | @property (nonatomic, copy) NSStringTableViewNSInteger titleForHeaderInSection; 60 | @property (nonatomic, copy) NSStringTableViewNSInteger titleForFooterInSection; 61 | 62 | 63 | @property (nonatomic, copy) BOOLTableViewIndexPath canMoveRowAtIndexPath; 64 | 65 | typedef NSArray *(^SectionIndexTitlesForTableView)(UITableView *tableView); 66 | @property (nonatomic, copy) SectionIndexTitlesForTableView sectionIndexTitlesForTableView; 67 | 68 | typedef NSInteger (^NSIntegerUITableViewNSStringNSInteger)(UITableView *tableView,NSString *title,NSInteger index); 69 | @property (nonatomic, copy) NSIntegerUITableViewNSStringNSInteger sectionForSectionIndexTitle; 70 | 71 | typedef UIView *(^UIViewTableViewNSInteger)(UITableView *tableView,NSInteger section); 72 | @property (nonatomic, copy) UIViewTableViewNSInteger viewForHeaderInSection; 73 | @property (nonatomic, copy) UIViewTableViewNSInteger viewForFooterInSection; 74 | 75 | typedef NSIndexPath *(^NSIndexPathUITableViewNSIndexPath)(UITableView *tableView,NSIndexPath *indexPath); 76 | @property (nonatomic, copy) NSIndexPathUITableViewNSIndexPath willSelectRowAtIndexPath; 77 | @property (nonatomic, copy) NSIndexPathUITableViewNSIndexPath willDeselectRowAtIndexPath; 78 | 79 | typedef UITableViewCellEditingStyle (^UITableViewCellEditingStyleUITableViewNSIndexPath)(UITableView *tableView,NSIndexPath *indexPath); 80 | @property (nonatomic, copy) UITableViewCellEditingStyleUITableViewNSIndexPath editingStyleForRowAtIndexPath; 81 | 82 | typedef NSString *(^NSStringTableViewIndexPath)(UITableView *tableView,NSIndexPath *indexPath); 83 | @property (nonatomic, copy) NSStringTableViewIndexPath titleForDeleteConfirmationButtonForRowAtIndexPath; 84 | 85 | 86 | typedef NSIndexPath *(^NSIndexPathUITableViewNSIndexPathNSIndexPath)(UITableView *tableView,NSIndexPath *sourceIndexPath,NSIndexPath *proposedDestinationIndexPath); 87 | @property (nonatomic, copy) NSIndexPathUITableViewNSIndexPathNSIndexPath targetIndexPathForMoveFromRowAtIndexPath; 88 | 89 | typedef NSInteger (^NSIntegerUITableViewNSIndexPath)(UITableView *tableView,NSIndexPath *indexPath); 90 | @property (nonatomic, copy) NSIntegerUITableViewNSIndexPath indentationLevelForRowAtIndexPath; 91 | 92 | typedef BOOL (^BOOLUITableViewSELNSIndexPath)(UITableView *tableView,SEL action,NSIndexPath *indexPath); 93 | @property (nonatomic, copy) BOOLUITableViewSELNSIndexPath canPerformAction; 94 | 95 | typedef BOOL (^BOOLUITableViewFocusUpdateContext)(UITableView *tableView,UITableViewFocusUpdateContext *context); 96 | @property (nonatomic, copy) BOOLUITableViewFocusUpdateContext shouldUpdateFocusInContext; 97 | 98 | typedef NSIndexPath *(^NSIndexPathUITableView)(UITableView *tableView); 99 | @property (nonatomic, copy) NSIndexPathUITableView indexPathForPreferredFocusedViewInTableView; 100 | 101 | @end 102 | 103 | 104 | -------------------------------------------------------------------------------- /DYKitDemo/module/view/OneTypeCellByNibTableViewCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 35 | 41 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | DYKit 2 | ============== 3 | [![CocoaPods](http://img.shields.io/cocoapods/v/DYKit.svg?style=flat)](http://cocoapods.org/pods/DYKit)  4 | [![CocoaPods](http://img.shields.io/cocoapods/p/DYKit.svg?style=flat)](http://cocoadocs.org/docsets/DYKit)  5 | [![Support](https://img.shields.io/badge/support-iOS%208%2B%20-blue.svg?style=flat)](https://www.apple.com/nl/ios/)  6 | 7 | DYKit是一套使用了ReactiveObjC的系统控件封装库 8 | 9 | DYKit将UIkit中的大部分常用组件进行了封装,让这些控件不再使用delegate,datasource等而是可以通过block,RACSignal等形式进行控制,通过链式调用,很多控件从此可以通过一句代码完成。 10 | 11 | sample 12 | ============== 13 | #### 不需要delegate,datasource。你可以如此简单的创建一个tableView: 14 | 15 | ```objc 16 | [self.homeTableView assemblyWithAssemblyBlock:^(UITableViewCell *cell, NSString *text, NSIndexPath *indexPath) { 17 | //这个block充当了cellForRowAtIndexPath的作用 18 | cell.textLabel.text = text; 19 | }]; 20 | 21 | //设定数据 22 | self.homeTableView.dy_data = @[@"标题1",@"标题2",@"标题3",@"标题4"]; 23 | ``` 24 | 1. `dy_data`是一个`NSArray`的属性。你只能给他绑定发送`NSArray`的`RACSignal`.当然你也可以像下面这样直接给他赋值。 25 | `self,homeTableView.dy_data = @[@"标题1",@"标题2",@"标题3",@"标题4"];` 26 | 2. `dy_data`中的每一个元素都会出现在上面那个`assemblyWithAssemblyBlock`中的第二个参数。你可以修改参数成任意类型,比如`model`或`videModel`甚至是`NSString`。 27 | 28 | 29 | 30 | #### 你可以使用下面的方法来创建不同类型的tableView: 31 | 32 | ```objc 33 | [self.tableView assemblyByReuseIdentifier:@"OneTypeCellByNibTableViewCell" withAssemblyBlock:^(OneTypeCellByNibTableViewCell *cell, User *user, NSIndexPath *indexPath) { 34 | cell.headImageView.image = [UIImage imageNamed:user.img]; 35 | cell.headImageView.backgroundColor = user.sex == 0 ? [UIColor purpleColor] : [UIColor blackColor]; 36 | cell.nameLabel.text = user.name; 37 | cell.ageLabel.text = user.age; 38 | cell.descLabel.text = user.desc; 39 | }]; 40 | 41 | 42 | User *user1 = [User new]; 43 | User *user2 = [User new]; 44 | User *user3 = [User new]; 45 | 46 | user1.id = @"001"; 47 | user1.name = @"jack"; 48 | user1.img = @"head"; 49 | user1.age = @"29"; 50 | user1.desc = @"她喜欢黑色"; 51 | user1.sex = 0; 52 | user2.id = @"002"; 53 | user2.name = @"Pink man"; 54 | user2.img = @"head"; 55 | user2.age = @"18"; 56 | user2.desc = @"白老师得意门生"; 57 | user2.sex = 1; 58 | user3.id = @"003"; 59 | user3.name = @"MR.white"; 60 | user3.img = @"head"; 61 | user3.age = @"43"; 62 | user3.desc = @"平淡无奇的中学化学老师"; 63 | user3.sex = 1; 64 | self.tableView.dy_data = @[user1,user2,user3]; 65 | ``` 66 | 1. `reuseIdentifier`参数传入一个复用ID。用来自动注册cell和使用复用cell,可支持nib或class创建的cell。(优先寻找`reuseIdentifier`命名的xib文件,找到的情况下直接注册nibcell。找不到的情况下会使用`reuseIdentifier`作为类名的非nib创建cell) 67 | 68 | 69 | #### 当然你也可以使用下面这些方法来满足不同cell在同一个tableView或者不同的cetion下使用的需求 70 | 71 | ```objc 72 | /** 73 | 指定section和row进行cell设定 74 | 75 | @param identifier cell的重用ID(使用cell的类名,可以是xib或者class创建) 76 | @param section 指定section位置 77 | @param row 指定row位置 78 | @param block cellForRowAtIndexPath的block 79 | @return 返回自身,用于链式调用 80 | */ 81 | - (UITableView*) addReuseIdentifier:(NSString *)identifier FromSection:(int)section row:(int)row withAssemblyBlock:(AssemblyBlock)block; 82 | 83 | /** 84 | 指定section进行cell设定。默认本section下的cell全部按照block内容进行设定 85 | 86 | @param identifier cell的重用ID(使用cell的类名,可以是xib或者class创建) 87 | @param section 指定section位置 88 | @param block cellForRowAtIndexPath的block 89 | @return 返回自身,用于链式调用 90 | */ 91 | - (UITableView*) addReuseIdentifier:(NSString *)identifier FromSection:(int)section withAssemblyBlock:(AssemblyBlock)block; 92 | 93 | /** 94 | 指定row进行cell设定。默认只有一个section 95 | 96 | @param identifier cell的重用ID(使用cell的类名,可以是xib或者class创建) 97 | @param row 指定row位置 98 | @param block cellForRowAtIndexPath的block 99 | @return 返回自身,用于链式调用 100 | */ 101 | - (UITableView*) addReuseIdentifier:(NSString *)identifier FromRow:(int)row withAssemblyBlock:(AssemblyBlock)block; 102 | 103 | /** 104 | 指定具体的indexPath进行cell设定,可选择任意位置 105 | 106 | @param identifier cell的重用ID(使用cell的类名,可以是xib或者class创建) 107 | @param slotBlock 用于指定具体条件的block。通过对参数的indexPath进行判断,返回需要的具体位置 108 | @param cellBindBlock cellForRowAtIndexPath的block 109 | @return 返回自身,用于链式调用 110 | */ 111 | - (UITableView*) addReuseIdentifier:(NSString *)identifier FromSlot:(SlotBlock)slotBlock withAssemblyBlock:(AssemblyBlock)cellBindBlock; 112 | ``` 113 | 114 | #### 代理事件 115 | 你可以用这些方法获得你需要的代理事件的Signal 116 | 117 | ```objc 118 | #pragma delegate方法 119 | - (RACSignal*)accessoryButtonTappedForRowWithIndexPathSignal; 120 | - (RACSignal*)didEndDisplayingCellSignal; 121 | - (RACSignal*)didEndDisplayingHeaderViewSignal; 122 | - (RACSignal*)didEndDisplayingFooterViewSignal; 123 | - (RACSignal*)didHighlightRowAtIndexPathSignal; 124 | - (RACSignal*)didUnhighlightRowAtIndexPathSignal; 125 | - (RACSignal*)didSelectRowAtIndexPathSignal; 126 | - (RACSignal*)didDeselectRowAtIndexPathSignal; 127 | - (RACSignal*)didEndEditingRowAtIndexPathSignal; 128 | - (RACSignal*)didUpdateFocusInContextSignal; 129 | - (RACSignal*)performActionSignal; 130 | - (RACSignal*)willBeginEditingRowAtIndexPathSignal; 131 | - (RACSignal*)willDisplayCellSignal; 132 | - (RACSignal*)willDisplayHeaderViewSignal; 133 | - (RACSignal*)willDisplayFooterViewSignal; 134 | 135 | #pragma DataSource方法 136 | - (RACSignal*)commitEditingStyleSignal; 137 | - (RACSignal*)moveRowAtIndexPathSignal; 138 | ``` 139 | 140 | #### 回调方法 141 | 你也可以通过传入block的方法来设置tableView的属性。名字和原来的那些一样 142 | 143 | ```objc 144 | #pragma 配置用block 145 | - (UITableView*)setHeightForRowAtIndexPath:(CGFloatTableViewIndexPath)block; 146 | - (UITableView*)setEditActionsForRowAtIndexPath:(EditActionsForRowAtIndexPath)block; 147 | - (UITableView*)setShouldHighlightRowAtIndexPath:(BOOLTableViewIndexPath)block; 148 | - (UITableView*)setCanEditRowAtIndexPath:(BOOLTableViewIndexPath)block; 149 | - (UITableView*)setNumberOfRowsInSection:(NSIntegerTableViewIndexPath)block; 150 | //- (void)setCellForRowAtIndexPath:(UITableViewCellTableViewIndexPath)block; 151 | - (UITableView*)setNumberOfSectionsInTableView:(NSIntegerUITableView)block; 152 | - (UITableView*)setTitleForHeaderInSection:(NSStringTableViewNSInteger)block; 153 | - (UITableView*)setTitleForFooterInSection:(NSStringTableViewNSInteger)block; 154 | - (UITableView*)setCanMoveRowAtIndexPath:(BOOLTableViewIndexPath)block; 155 | - (UITableView*)setSectionIndexTitlesForTableView:(SectionIndexTitlesForTableView)block; 156 | - (UITableView*)setSectionForSectionIndexTitle:(NSIntegerUITableViewNSStringNSInteger)block; 157 | - (UITableView*)setHeightForHeaderInSection:(CGFloatTableViewNSInteger)block; 158 | - (UITableView*)setHeightForFooterInSection:(CGFloatTableViewNSInteger)block; 159 | - (UITableView*)setEstimatedHeightForRowAtIndexPath:(CGFloatTableViewIndexPath)block; 160 | - (UITableView*)setEstimatedHeightForHeaderInSection:(CGFloatTableViewNSInteger)block; 161 | - (UITableView*)setEstimatedHeightForFooterInSection:(CGFloatTableViewNSInteger)block; 162 | - (UITableView*)setViewForHeaderInSection:(UIViewTableViewNSInteger)block; 163 | - (UITableView*)setViewForFooterInSection:(UIViewTableViewNSInteger)block; 164 | - (UITableView*)setWillSelectRowAtIndexPath:(NSIndexPathUITableViewNSIndexPath)block; 165 | - (UITableView*)setWillDeselectRowAtIndexPath:(NSIndexPathUITableViewNSIndexPath)block; 166 | - (UITableView*)setEditingStyleForRowAtIndexPath:(UITableViewCellEditingStyleUITableViewNSIndexPath)block; 167 | - (UITableView*)setTitleForDeleteConfirmationButtonForRowAtIndexPath:(NSStringTableViewIndexPath)block; 168 | - (UITableView*)setShouldIndentWhileEditingRowAtIndexPath:(BOOLTableViewIndexPath)block; 169 | - (UITableView*)setTargetIndexPathForMoveFromRowAtIndexPath:(NSIndexPathUITableViewNSIndexPathNSIndexPath)block; 170 | - (UITableView*)setIndentationLevelForRowAtIndexPath:(NSIntegerUITableViewNSIndexPath)block; 171 | - (UITableView*)setShouldShowMenuForRowAtIndexPath:(BOOLTableViewIndexPath)block; 172 | - (UITableView*)setCanPerformAction:(BOOLUITableViewSELNSIndexPath)block; 173 | - (UITableView*)setCanFocusRowAtIndexPath:(BOOLTableViewIndexPath)block; 174 | - (UITableView*)setShouldUpdateFocusInContext:(BOOLUITableViewFocusUpdateContext)block; 175 | - (UITableView*)setIndexPathForPreferredFocusedViewInTableView:(NSIndexPathUITableView)block; 176 | 177 | ``` 178 | 179 | 180 | 181 | 182 | 183 | 184 | 安装 185 | ============== 186 | 187 | ### CocoaPods 188 | 189 | 1. 在 Podfile 中添加 `pod 'DYKit'`。 190 | 2. 执行 `pod install` 或 `pod update`。 191 | 3. 导入 \"DYKit.h\"。 192 | 193 | 将来 194 | ============== 195 | 1. 实现UIcollectionView的封装 196 | 2. 实现UITextView的封装 197 | 198 | 系统要求 199 | ============== 200 | 该项目最低支持 `iOS 8.0`。 201 | 202 | 许可证 203 | ============== 204 | DYKit 使用 MIT 许可证,详情见 LICENSE 文件。 205 | 206 | 207 | -------------------------------------------------------------------------------- /DYKit/UITableView+DYTableViewBinder.m: -------------------------------------------------------------------------------- 1 | // 2 | // UITableView+DYTableViewBinder.m 3 | // DYMVVMRAC 4 | // 5 | // Created by DuYe on 2017/6/30. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "UITableView+DYTableViewBinder.h" 10 | 11 | @implementation UITableView (DYTableViewBinder) 12 | 13 | #pragma 属性 14 | DYSYNTH_DYNAMIC_PROPERTY_OBJECT(agent, setAgent, RETAIN, DYTableViewAgent *) 15 | DYSYNTH_DYNAMIC_PROPERTY_CTYPE(autoReload, setAutoReload, BOOL) 16 | 17 | - (NSArray *)data{return self.agent.data;} 18 | - (void)setData:(NSArray *)data{self.agent.data = data;} 19 | 20 | - (UITableView*)setSectionData:(GetSectionData)block{ 21 | self.agent.getSectionData = block; 22 | return self; 23 | } 24 | 25 | #pragma 主要装配方法 26 | - (DYTableViewModule*) assembly:(AssemblyBlock)block{ 27 | return [self assembly:block withPlug:UITableViewCell.class]; 28 | } 29 | 30 | - (DYTableViewModule*) assembly:(AssemblyBlock)block withPlug:(Class)plug{ 31 | [self agentInitialize]; 32 | [self dyRegisterForCellReuseIdentifier:NSStringFromClass(plug)]; 33 | self.agent.defaultTableModule.reuseIdentifier = NSStringFromClass(plug); 34 | self.agent.defaultTableModule.assemblyBlock = block; 35 | return self.agent.defaultTableModule; 36 | } 37 | 38 | - (DYTableViewModule*) assembly:(AssemblyBlock)assemblyBlock fromSlot:(SlotBlock)slotBlock{ 39 | return [self assembly:assemblyBlock fromSlot:slotBlock withPlug:UITableViewCell.class]; 40 | } 41 | 42 | - (DYTableViewModule*) assembly:(AssemblyBlock)assemblyBlock fromSlot:(SlotBlock)slotBlock withPlug:(Class)plug{ 43 | [self agentInitialize]; 44 | [self dyRegisterForCellReuseIdentifier:NSStringFromClass(plug)]; 45 | DYTableViewModule *module = [[DYTableViewModule alloc] init]; 46 | module.reuseIdentifier = NSStringFromClass(plug); 47 | module.slotBlock = slotBlock; 48 | module.assemblyBlock = assemblyBlock; 49 | 50 | NSUInteger __block count = self.agent.tableModuleLists.count; 51 | [self.agent.tableModuleLists addObject:module]; 52 | @weakify(self) 53 | [RACObserve(module, self) subscribeNext:^(id _Nullable x) { 54 | @strongify(self) 55 | [self.agent.tableModuleLists replaceObjectAtIndex:count withObject:module]; 56 | }]; 57 | 58 | return module; 59 | } 60 | 61 | - (void)agentInitialize{ 62 | if (!self.agent) { 63 | self.agent = [[DYTableViewAgent alloc] init]; 64 | self.dataSource = self.agent; 65 | self.delegate = self.agent; 66 | self.autoReload = YES; 67 | 68 | @weakify(self) 69 | RACDisposable __block *reloadDataDisposable = [[RACObserve(self, agent.data) skip:1] subscribeNext:^(id _Nullable x) { 70 | @strongify(self) 71 | [self reloadData]; 72 | }]; 73 | 74 | [[[RACObserve(self, autoReload) skip:1] filter:^BOOL(id _Nullable value) { 75 | return [value boolValue] == NO; 76 | }] subscribeNext:^(id _Nullable x) { 77 | [reloadDataDisposable dispose]; 78 | }]; 79 | 80 | [[[RACObserve(self, autoReload) skip:1] filter:^BOOL(id _Nullable value) { 81 | return [value boolValue] == YES; 82 | }] subscribeNext:^(id _Nullable x) { 83 | @strongify(self) 84 | @weakify(self) 85 | reloadDataDisposable = [[RACObserve(self, agent.data) skip:1] subscribeNext:^(id _Nullable x) { 86 | @strongify(self) 87 | [self reloadData]; 88 | }]; 89 | }]; 90 | } 91 | } 92 | 93 | - (void)dyRegisterForCellReuseIdentifier:(NSString *)identifier{ 94 | if ([[NSBundle mainBundle] pathForResource:identifier ofType:@"nib"]) { 95 | [self registerNib:[UINib nibWithNibName:identifier bundle:nil] forCellReuseIdentifier:identifier]; 96 | } else { 97 | [self registerClass:NSClassFromString(identifier) forCellReuseIdentifier:identifier]; 98 | } 99 | } 100 | 101 | #pragma 配置用block 102 | - (UITableView*)setHeightForRowAtIndexPath:(CGFloatTableViewIndexPath)block{[self agentInitialize];self.agent.heightForRowAtIndexPath = block;return self;} 103 | - (UITableView*)setEditActionsForRowAtIndexPath:(EditActionsForRowAtIndexPath)block{[self agentInitialize];self.agent.editActionsForRowAtIndexPath = block;return self;} 104 | - (UITableView*)setShouldHighlightRowAtIndexPath:(BOOLTableViewIndexPath)block{[self agentInitialize];self.agent.shouldHighlightRowAtIndexPath = block;return self;} 105 | - (UITableView*)setCanEditRowAtIndexPath:(BOOLTableViewIndexPath)block{[self agentInitialize];self.agent.canEditRowAtIndexPath = block;return self;} 106 | - (UITableView*)setNumberOfRowsInSection:(NSIntegerTableViewIndexPath)block{[self agentInitialize];self.agent.numberOfRowsInSection = block;return self;} 107 | //- (void)setCellForRowAtIndexPath:(UITableViewCellTableViewIndexPath)block{self.agent.cellForRowAtIndexPath = block;} 108 | - (UITableView*)setNumberOfSectionsInTableView:(NSIntegerUITableView)block{[self agentInitialize];self.agent.numberOfSectionsInTableView = block;return self;} 109 | - (UITableView*)setTitleForHeaderInSection:(NSStringTableViewNSInteger)block{[self agentInitialize];self.agent.titleForHeaderInSection = block;return self;} 110 | - (UITableView*)setTitleForFooterInSection:(NSStringTableViewNSInteger)block{[self agentInitialize];self.agent.titleForFooterInSection = block;return self;} 111 | - (UITableView*)setCanMoveRowAtIndexPath:(BOOLTableViewIndexPath)block{[self agentInitialize];self.agent.canMoveRowAtIndexPath = block;return self;} 112 | - (UITableView*)setSectionIndexTitlesForTableView:(SectionIndexTitlesForTableView)block{[self agentInitialize];self.agent.sectionIndexTitlesForTableView = block;return self;} 113 | - (UITableView*)setSectionForSectionIndexTitle:(NSIntegerUITableViewNSStringNSInteger)block{[self agentInitialize];self.agent.sectionForSectionIndexTitle = block;return self;} 114 | - (UITableView*)setHeightForHeaderInSection:(CGFloatTableViewNSInteger)block{[self agentInitialize];self.agent.heightForHeaderInSection = block;return self;} 115 | - (UITableView*)setHeightForFooterInSection:(CGFloatTableViewNSInteger)block{[self agentInitialize];self.agent.heightForFooterInSection = block;return self;} 116 | - (UITableView*)setEstimatedHeightForRowAtIndexPath:(CGFloatTableViewIndexPath)block{[self agentInitialize];self.agent.estimatedHeightForRowAtIndexPath = block;return self;} 117 | - (UITableView*)setEstimatedHeightForHeaderInSection:(CGFloatTableViewNSInteger)block{[self agentInitialize];self.agent.estimatedHeightForHeaderInSection = block;return self;} 118 | - (UITableView*)setEstimatedHeightForFooterInSection:(CGFloatTableViewNSInteger)block{[self agentInitialize];self.agent.estimatedHeightForFooterInSection = block;return self;} 119 | - (UITableView*)setViewForHeaderInSection:(UIViewTableViewNSInteger)block{[self agentInitialize];self.agent.viewForHeaderInSection = block;return self;} 120 | - (UITableView*)setViewForFooterInSection:(UIViewTableViewNSInteger)block{[self agentInitialize];self.agent.viewForFooterInSection = block;return self;} 121 | - (UITableView*)setWillSelectRowAtIndexPath:(NSIndexPathUITableViewNSIndexPath)block{[self agentInitialize];self.agent.willSelectRowAtIndexPath = block;return self;} 122 | - (UITableView*)setWillDeselectRowAtIndexPath:(NSIndexPathUITableViewNSIndexPath)block{[self agentInitialize];self.agent.willDeselectRowAtIndexPath = block;return self;} 123 | - (UITableView*)setEditingStyleForRowAtIndexPath:(UITableViewCellEditingStyleUITableViewNSIndexPath)block{[self agentInitialize];self.agent.editingStyleForRowAtIndexPath = block;return self;} 124 | //- (UITableView*)setTitleForDeleteConfirmationButtonForRowAtIndexPath:(NSStringTableViewIndexPath)block{[self agentInitialize];self.agent.titleForDeleteConfirmationButtonForRowAtIndexPath = block;return self;} 125 | - (UITableView*)setShouldIndentWhileEditingRowAtIndexPath:(BOOLTableViewIndexPath)block{[self agentInitialize];self.agent.shouldIndentWhileEditingRowAtIndexPath = block;return self;} 126 | - (UITableView*)setTargetIndexPathForMoveFromRowAtIndexPath:(NSIndexPathUITableViewNSIndexPathNSIndexPath)block{[self agentInitialize];self.agent.targetIndexPathForMoveFromRowAtIndexPath = block;return self;} 127 | - (UITableView*)setIndentationLevelForRowAtIndexPath:(NSIntegerUITableViewNSIndexPath)block{[self agentInitialize];self.agent.indentationLevelForRowAtIndexPath = block;return self;} 128 | - (UITableView*)setShouldShowMenuForRowAtIndexPath:(BOOLTableViewIndexPath)block{[self agentInitialize];self.agent.shouldShowMenuForRowAtIndexPath = block;return self;} 129 | - (UITableView*)setCanPerformAction:(BOOLUITableViewSELNSIndexPath)block{[self agentInitialize];self.agent.canPerformAction = block;return self;} 130 | - (UITableView*)setCanFocusRowAtIndexPath:(BOOLTableViewIndexPath)block{[self agentInitialize];self.agent.canFocusRowAtIndexPath = block;return self;} 131 | - (UITableView*)setShouldUpdateFocusInContext:(BOOLUITableViewFocusUpdateContext)block{[self agentInitialize];self.agent.shouldUpdateFocusInContext = block;return self;} 132 | - (UITableView*)setIndexPathForPreferredFocusedViewInTableView:(NSIndexPathUITableView)block{[self agentInitialize];self.agent.indexPathForPreferredFocusedViewInTableView = block;return self;} 133 | 134 | #pragma delegate方法 135 | - (RACSignal*)accessoryButtonTappedForRowWithIndexPathSignal{ 136 | [self agentInitialize]; 137 | return [self.agent rac_signalForSelector:@selector(tableView:accessoryButtonTappedForRowWithIndexPath:)]; 138 | } 139 | - (RACSignal*)didEndDisplayingCellSignal{ 140 | [self agentInitialize]; 141 | return [self.agent rac_signalForSelector:@selector(tableView:didEndDisplayingCell:forRowAtIndexPath:)]; 142 | } 143 | - (RACSignal*)didEndDisplayingHeaderViewSignal{ 144 | [self agentInitialize]; 145 | return [self.agent rac_signalForSelector:@selector(tableView:didEndDisplayingHeaderView:forSection:)]; 146 | } 147 | - (RACSignal*)didEndDisplayingFooterViewSignal{ 148 | [self agentInitialize]; 149 | return [self.agent rac_signalForSelector:@selector(tableView:didEndDisplayingFooterView:forSection:)]; 150 | } 151 | - (RACSignal*)didHighlightRowAtIndexPathSignal{ 152 | [self agentInitialize]; 153 | return [self.agent rac_signalForSelector:@selector(tableView:didHighlightRowAtIndexPath:)]; 154 | } 155 | - (RACSignal*)didUnhighlightRowAtIndexPathSignal{ 156 | [self agentInitialize]; 157 | return [self.agent rac_signalForSelector:@selector(tableView:didUnhighlightRowAtIndexPath:)]; 158 | } 159 | - (RACSignal*)didSelectRowAtIndexPathSignal{ 160 | [self agentInitialize]; 161 | return [self.agent rac_signalForSelector:@selector(tableView:didSelectRowAtIndexPath:)]; 162 | } 163 | - (RACSignal*)didDeselectRowAtIndexPathSignal{ 164 | [self agentInitialize]; 165 | return [self.agent rac_signalForSelector:@selector(tableView:didDeselectRowAtIndexPath:)]; 166 | } 167 | - (RACSignal*)didEndEditingRowAtIndexPathSignal{ 168 | [self agentInitialize]; 169 | return [self.agent rac_signalForSelector:@selector(tableView:didEndEditingRowAtIndexPath:)]; 170 | } 171 | - (RACSignal*)didUpdateFocusInContextSignal{ 172 | [self agentInitialize]; 173 | return [self.agent rac_signalForSelector:@selector(tableView:didUpdateFocusInContext:withAnimationCoordinator:)]; 174 | } 175 | - (RACSignal*)performActionSignal{ 176 | [self agentInitialize]; 177 | return [self.agent rac_signalForSelector:@selector(tableView:performAction:forRowAtIndexPath:withSender:)]; 178 | } 179 | - (RACSignal*)willBeginEditingRowAtIndexPathSignal{ 180 | [self agentInitialize]; 181 | return [self.agent rac_signalForSelector:@selector(tableView:willBeginEditingRowAtIndexPath:)]; 182 | } 183 | - (RACSignal*)willDisplayCellSignal{ 184 | [self agentInitialize]; 185 | return [self.agent rac_signalForSelector:@selector(tableView:willDisplayCell:forRowAtIndexPath:)]; 186 | } 187 | - (RACSignal*)willDisplayHeaderViewSignal{ 188 | [self agentInitialize]; 189 | return [self.agent rac_signalForSelector:@selector(tableView:willDisplayHeaderView:forSection:)]; 190 | } 191 | - (RACSignal*)willDisplayFooterViewSignal{ 192 | [self agentInitialize]; 193 | return [self.agent rac_signalForSelector:@selector(tableView:willDisplayFooterView:forSection:)]; 194 | } 195 | 196 | #pragma DataSource方法 197 | - (RACSignal*)commitEditingStyleSignal{ 198 | [self agentInitialize]; 199 | return [self.agent rac_signalForSelector:@selector(tableView:commitEditingStyle:forRowAtIndexPath:)]; 200 | } 201 | - (RACSignal*)moveRowAtIndexPathSignal{ 202 | [self agentInitialize]; 203 | return [self.agent rac_signalForSelector:@selector(tableView:moveRowAtIndexPath:toIndexPath:)]; 204 | } 205 | 206 | @end 207 | -------------------------------------------------------------------------------- /DYKit/DYTableViewAgent.m: -------------------------------------------------------------------------------- 1 | // 2 | // DYTableViewDataSouce.m 3 | // DYMVVMRAC 4 | // 5 | // Created by DuYe on 2017/7/7. 6 | // Copyright © 2017年 DuYe. All rights reserved. 7 | // 8 | 9 | #import "DYTableViewAgent.h" 10 | 11 | @implementation DYTableViewAgent 12 | 13 | #pragma lazyProperties 14 | DYN_LAZY(tableModuleLists, NSMutableArray) 15 | - (DYTableViewModule *)defaultTableModule 16 | { 17 | return DY_LAZY(_defaultTableModule,({ 18 | DYTableViewModule *module = [[DYTableViewModule alloc] init]; 19 | module.reuseIdentifier = @"UITableViewCell"; 20 | module.slotBlock = ^BOOL(NSIndexPath *indexPath, id model) {return YES;}; 21 | module; 22 | })); 23 | } 24 | 25 | #pragma dataSource 26 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 27 | //第一优先级 用户局部block定制 28 | if (self.numberOfRowsInSection) { 29 | return self.numberOfRowsInSection(tableView, section); 30 | } 31 | //第二优先级 sectionData 32 | if (self.getSectionData) { 33 | return self.getSectionData(self.data[section],section).count; 34 | } 35 | //第三优先级 默认值 36 | return self.data.count; 37 | } 38 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 39 | UITableViewCell *cell; 40 | if (self.getSectionData) { 41 | for (DYTableViewModule *module in self.tableModuleLists) { 42 | if (module.slotBlock(indexPath,self.getSectionData(self.data[indexPath.section],indexPath.section)[indexPath.row])) { 43 | cell = [tableView dequeueReusableCellWithIdentifier:module.reuseIdentifier]; 44 | module.assemblyBlock(cell, self.getSectionData(self.data[indexPath.section],indexPath.section)[indexPath.row], indexPath); 45 | return cell; 46 | } 47 | } 48 | } else { 49 | for (DYTableViewModule *module in self.tableModuleLists) { 50 | if (module.slotBlock(indexPath,self.data[indexPath.row])) { 51 | cell = [tableView dequeueReusableCellWithIdentifier:module.reuseIdentifier]; 52 | module.assemblyBlock(cell, self.data[indexPath.row], indexPath); 53 | return cell; 54 | } 55 | } 56 | } 57 | 58 | cell = [tableView dequeueReusableCellWithIdentifier:self.defaultTableModule.reuseIdentifier]; 59 | 60 | if (self.getSectionData) { 61 | self.defaultTableModule.assemblyBlock(cell, self.getSectionData(self.data[indexPath.section],indexPath.section)[indexPath.row], indexPath); 62 | return cell; 63 | } else { 64 | self.defaultTableModule.assemblyBlock(cell, self.data[indexPath.row], indexPath); 65 | return cell; 66 | } 67 | } 68 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 69 | //第一优先级 用户局部block定制 70 | if (self.numberOfSectionsInTableView) { 71 | return self.numberOfSectionsInTableView(tableView); 72 | } 73 | //第二优先级 sectionData 74 | if (self.getSectionData) { 75 | return self.data.count; 76 | } 77 | //第三优先级 默认值 78 | return 1; 79 | } 80 | - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{ 81 | //第一优先级 用户局部block定制 82 | if (self.canEditRowAtIndexPath) { 83 | return self.canEditRowAtIndexPath(tableView, indexPath); 84 | } 85 | //第二优先级 用户局部定制 86 | if (self.getSectionData) { 87 | for (DYTableViewModule *module in self.tableModuleLists) { 88 | if (module.slotBlock(indexPath,self.getSectionData(self.data[indexPath.section],indexPath.section)[indexPath.row])) { 89 | if (module.editing) { 90 | return module.editing; 91 | } 92 | } 93 | } 94 | } else { 95 | for (DYTableViewModule *module in self.tableModuleLists) { 96 | if (module.slotBlock(indexPath,self.data[indexPath.row])) { 97 | if (module.editing) { 98 | return module.editing; 99 | } 100 | } 101 | } 102 | } 103 | //第三优先级 默认全局定制 104 | if (self.defaultTableModule) { 105 | return self.defaultTableModule.editing; 106 | } 107 | //第四优先级 默认值 108 | return tableView.editing; 109 | } 110 | - (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ 111 | return self.titleForHeaderInSection ? self.titleForHeaderInSection(tableView,section) : nil; 112 | } 113 | - (nullable NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{ 114 | return self.titleForFooterInSection ? self.titleForFooterInSection(tableView,section) : nil; 115 | } 116 | - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{ 117 | return self.canMoveRowAtIndexPath ? self.canMoveRowAtIndexPath(tableView,indexPath) : NO; 118 | } 119 | - (nullable NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{ 120 | return self.sectionIndexTitlesForTableView ? self.sectionIndexTitlesForTableView(tableView) : nil; 121 | } 122 | - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index{ 123 | return self.sectionForSectionIndexTitle ? self.sectionForSectionIndexTitle(tableView,title,index) : 0; 124 | } 125 | 126 | 127 | #pragma delegate 128 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 129 | //第一优先级 用户局部block定制 130 | if (self.heightForRowAtIndexPath) { 131 | return self.heightForRowAtIndexPath(tableView, indexPath); 132 | } 133 | //第二优先级 用户局部定制 134 | if (self.getSectionData) { 135 | for (DYTableViewModule *module in self.tableModuleLists) { 136 | if (module.slotBlock(indexPath,self.getSectionData(self.data[indexPath.section],indexPath.section)[indexPath.row])) { 137 | if (module.rowHeight) { 138 | return module.rowHeight; 139 | } 140 | } 141 | } 142 | } else { 143 | for (DYTableViewModule *module in self.tableModuleLists) { 144 | if (module.slotBlock(indexPath,self.data[indexPath.row])) { 145 | if (module.rowHeight) { 146 | return module.rowHeight; 147 | } 148 | } 149 | } 150 | } 151 | //第三优先级 默认全局定制 152 | if (self.defaultTableModule) { 153 | if (self.defaultTableModule.rowHeight) { 154 | return self.defaultTableModule.rowHeight; 155 | } 156 | } 157 | //第四优先级 默认值 158 | return tableView.rowHeight; 159 | } 160 | - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ 161 | return self.heightForHeaderInSection ? self.heightForHeaderInSection(tableView,section) : tableView.sectionHeaderHeight; 162 | } 163 | - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{ 164 | return self.heightForFooterInSection ? self.heightForFooterInSection(tableView,section) : tableView.sectionFooterHeight; 165 | } 166 | - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(7_0){ 167 | //第一优先级 用户局部block定制 168 | if (self.estimatedHeightForRowAtIndexPath) { 169 | return self.estimatedHeightForRowAtIndexPath(tableView, indexPath); 170 | } 171 | //第二优先级 用户局部定制 172 | if (self.getSectionData) { 173 | for (DYTableViewModule *module in self.tableModuleLists) { 174 | if (module.slotBlock(indexPath,self.getSectionData(self.data[indexPath.section],indexPath.section)[indexPath.row])) { 175 | if (module.estimatedHeight) { 176 | return module.estimatedHeight; 177 | } 178 | } 179 | } 180 | } else { 181 | for (DYTableViewModule *module in self.tableModuleLists) { 182 | if (module.slotBlock(indexPath,self.data[indexPath.row])) { 183 | if (module.estimatedHeight) { 184 | return module.estimatedHeight; 185 | } 186 | } 187 | } 188 | } 189 | //第三优先级 默认全局定制 190 | if (self.defaultTableModule) { 191 | if (self.defaultTableModule.estimatedHeight) { 192 | return self.defaultTableModule.estimatedHeight; 193 | } 194 | } 195 | //第四优先级 默认值 196 | return [self tableView:tableView heightForRowAtIndexPath:indexPath]; 197 | } 198 | - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForHeaderInSection:(NSInteger)section NS_AVAILABLE_IOS(7_0){ 199 | return self.estimatedHeightForHeaderInSection ? self.estimatedHeightForHeaderInSection(tableView,section) : [self tableView:tableView heightForHeaderInSection:section]; 200 | } 201 | - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForFooterInSection:(NSInteger)section NS_AVAILABLE_IOS(7_0){ 202 | return self.estimatedHeightForFooterInSection ? self.estimatedHeightForFooterInSection(tableView,section) : [self tableView:tableView heightForFooterInSection:section]; 203 | } 204 | - (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ 205 | return self.viewForHeaderInSection ? self.viewForHeaderInSection(tableView,section) : nil; 206 | } 207 | - (nullable UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{ 208 | return self.viewForFooterInSection ? self.viewForFooterInSection(tableView,section) : nil; 209 | } 210 | - (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0){ 211 | return self.shouldHighlightRowAtIndexPath ? self.shouldHighlightRowAtIndexPath(tableView,indexPath) : YES; 212 | } 213 | - (nullable NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 214 | return self.willSelectRowAtIndexPath ? self.willSelectRowAtIndexPath(tableView,indexPath) : indexPath; 215 | } 216 | - (nullable NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0){ 217 | return self.willDeselectRowAtIndexPath ? self.willDeselectRowAtIndexPath(tableView,indexPath) : indexPath; 218 | } 219 | 220 | - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{ 221 | if ([self tableView:tableView canEditRowAtIndexPath:indexPath ]) { 222 | //第一优先级 用户局部block定制 223 | if (self.editingStyleForRowAtIndexPath) { 224 | return self.editingStyleForRowAtIndexPath(tableView, indexPath); 225 | } 226 | //第二优先级 用户局部定制 227 | if (self.getSectionData) { 228 | for (DYTableViewModule *module in self.tableModuleLists) { 229 | if (module.slotBlock(indexPath,self.getSectionData(self.data[indexPath.section],indexPath.section)[indexPath.row])) { 230 | if (module.editingStyle) { 231 | return module.editingStyle; 232 | } 233 | } 234 | } 235 | } else { 236 | for (DYTableViewModule *module in self.tableModuleLists) { 237 | if (module.slotBlock(indexPath,self.data[indexPath.row])) { 238 | if (module.editingStyle) { 239 | return module.editingStyle; 240 | } 241 | } 242 | } 243 | } 244 | //第三优先级 默认全局定制 245 | if (self.defaultTableModule) { 246 | if (self.defaultTableModule.editingStyle) { 247 | return self.defaultTableModule.editingStyle; 248 | } 249 | } 250 | 251 | return UITableViewCellEditingStyleDelete; 252 | } 253 | //第四优先级 默认值 254 | return UITableViewCellEditingStyleNone; 255 | } 256 | 257 | 258 | 259 | 260 | //- (nullable NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED{ 261 | // return self.titleForDeleteConfirmationButtonForRowAtIndexPath ? self.titleForDeleteConfirmationButtonForRowAtIndexPath(tableView,indexPath) : nil; 262 | //} 263 | 264 | 265 | 266 | 267 | - (nullable NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED{ 268 | //第一优先级 用户局部block定制 269 | if (self.editActionsForRowAtIndexPath) { 270 | return self.editActionsForRowAtIndexPath(tableView,indexPath); 271 | } 272 | //第二优先级 用户局部定制 273 | if (self.getSectionData) { 274 | for (DYTableViewModule *module in self.tableModuleLists) { 275 | if (module.slotBlock(indexPath,self.getSectionData(self.data[indexPath.section],indexPath.section)[indexPath.row])) { 276 | if (module.editActions) { 277 | NSMutableArray *array = [[NSMutableArray alloc] init]; 278 | for (DYTableViewRowAction *dyAction in module.editActions) { 279 | [array addObject:[UITableViewRowAction rowActionWithStyle:dyAction.accessibilityPerformMagicTap title:dyAction.title handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { 280 | dyAction.handler(action, self.data[indexPath.row], indexPath); 281 | }]]; 282 | } 283 | return array; 284 | } 285 | } 286 | } 287 | } else { 288 | for (DYTableViewModule *module in self.tableModuleLists) { 289 | if (module.slotBlock(indexPath,self.data[indexPath.row])) { 290 | if (module.editActions) { 291 | NSMutableArray *array = [[NSMutableArray alloc] init]; 292 | for (DYTableViewRowAction *dyAction in module.editActions) { 293 | [array addObject:[UITableViewRowAction rowActionWithStyle:dyAction.accessibilityPerformMagicTap title:dyAction.title handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { 294 | dyAction.handler(action, self.data[indexPath.row], indexPath); 295 | }]]; 296 | } 297 | return array; 298 | } 299 | } 300 | } 301 | } 302 | //第三优先级 默认全局定制 303 | if (self.defaultTableModule) { 304 | if (self.defaultTableModule.editActions) { 305 | NSMutableArray *array = [[NSMutableArray alloc] init]; 306 | for (DYTableViewRowAction *dyAction in self.defaultTableModule.editActions) { 307 | [array addObject:[UITableViewRowAction rowActionWithStyle:dyAction.accessibilityPerformMagicTap title:dyAction.title handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { 308 | dyAction.handler(action, self.data[indexPath.row], indexPath); 309 | }]]; 310 | } 311 | return array; 312 | } 313 | } 314 | //第四优先级 默认值 315 | return nil; 316 | } 317 | 318 | - (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath{ 319 | return self.shouldIndentWhileEditingRowAtIndexPath ? self.shouldIndentWhileEditingRowAtIndexPath(tableView,indexPath) : YES; 320 | } 321 | - (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath{ 322 | return self.targetIndexPathForMoveFromRowAtIndexPath ? self.targetIndexPathForMoveFromRowAtIndexPath(tableView,sourceIndexPath,proposedDestinationIndexPath) : proposedDestinationIndexPath; 323 | } 324 | - (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath{ 325 | //第一优先级 用户局部block定制 326 | if (self.indentationLevelForRowAtIndexPath) { 327 | return self.indentationLevelForRowAtIndexPath(tableView, indexPath); 328 | } 329 | //第二优先级 用户局部定制 330 | if (self.getSectionData) { 331 | for (DYTableViewModule *module in self.tableModuleLists) { 332 | if (module.slotBlock(indexPath,self.getSectionData(self.data[indexPath.section],indexPath.section)[indexPath.row])) { 333 | if (module.indentationLevel) { 334 | return module.indentationLevel; 335 | } 336 | } 337 | } 338 | } else { 339 | for (DYTableViewModule *module in self.tableModuleLists) { 340 | if (module.slotBlock(indexPath,self.data[indexPath.row])) { 341 | if (module.indentationLevel) { 342 | return module.indentationLevel; 343 | } 344 | } 345 | } 346 | } 347 | //第三优先级 默认全局定制 348 | if (self.defaultTableModule) { 349 | if (self.defaultTableModule.indentationLevel) { 350 | return self.defaultTableModule.indentationLevel; 351 | } 352 | } 353 | //第四优先级 默认值 354 | return 0; 355 | } 356 | - (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(5_0){ 357 | //第一优先级 用户局部block定制 358 | if (self.shouldShowMenuForRowAtIndexPath) { 359 | return self.shouldShowMenuForRowAtIndexPath(tableView, indexPath); 360 | } 361 | //第二优先级 用户局部定制 362 | if (self.getSectionData) { 363 | for (DYTableViewModule *module in self.tableModuleLists) { 364 | if (module.slotBlock(indexPath,self.getSectionData(self.data[indexPath.section],indexPath.section)[indexPath.row])) { 365 | if (module.shouldShowMenu) { 366 | return module.shouldShowMenu; 367 | } 368 | } 369 | } 370 | } else { 371 | for (DYTableViewModule *module in self.tableModuleLists) { 372 | if (module.slotBlock(indexPath,self.data[indexPath.row])) { 373 | if (module.shouldShowMenu) { 374 | return module.shouldShowMenu; 375 | } 376 | } 377 | } 378 | } 379 | //第三优先级 默认全局定制 380 | if (self.defaultTableModule) { 381 | if (self.defaultTableModule.shouldShowMenu) { 382 | return self.defaultTableModule.shouldShowMenu; 383 | } 384 | } 385 | //第四优先级 默认值 386 | return NO; 387 | } 388 | - (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(nullable id)sender NS_AVAILABLE_IOS(5_0){ 389 | return self.canPerformAction ? self.canPerformAction(tableView,action,indexPath) : NO; 390 | } 391 | - (BOOL)tableView:(UITableView *)tableView canFocusRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(9_0){ 392 | return self.canFocusRowAtIndexPath ? self.canFocusRowAtIndexPath(tableView,indexPath) : NO; 393 | } 394 | - (BOOL)tableView:(UITableView *)tableView shouldUpdateFocusInContext:(UITableViewFocusUpdateContext *)context NS_AVAILABLE_IOS(9_0){ 395 | return self.shouldUpdateFocusInContext ? self.shouldUpdateFocusInContext(tableView,context) : NO; 396 | } 397 | - (nullable NSIndexPath *)indexPathForPreferredFocusedViewInTableView:(UITableView *)tableView NS_AVAILABLE_IOS(9_0){ 398 | return self.indexPathForPreferredFocusedViewInTableView ? self.indexPathForPreferredFocusedViewInTableView(tableView) : nil; 399 | } 400 | 401 | 402 | - (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{} 403 | - (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath NS_AVAILABLE_IOS(6_0){} 404 | - (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0){} 405 | - (void)tableView:(UITableView *)tableView didEndDisplayingFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0){} 406 | - (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0){} 407 | - (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0){} 408 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{} 409 | - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0){} 410 | - (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(nullable NSIndexPath *)indexPath __TVOS_PROHIBITED{} 411 | - (void)tableView:(UITableView *)tableView didUpdateFocusInContext:(UITableViewFocusUpdateContext *)context withAnimationCoordinator:(UIFocusAnimationCoordinator *)coordinator NS_AVAILABLE_IOS(9_0){} 412 | - (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(nullable id)sender NS_AVAILABLE_IOS(5_0){} 413 | - (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath __TVOS_PROHIBITED{} 414 | - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{} 415 | - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0){} 416 | - (void)tableView:(UITableView *)tableView willDisplayFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0){} 417 | 418 | #pragma 自定义方法 419 | 420 | //- (NSInteger)getFlattenRow:(UITableView *)tableView IndexPath:(NSIndexPath*) indexPath{ 421 | // return indexPath.section == 0 ? indexPath.row : [self tableView:tableView numberOfRowsInSection:indexPath.section - 1] + [self getFlattenRow:tableView IndexPath:[NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section - 1]]; 422 | //} 423 | 424 | @end 425 | -------------------------------------------------------------------------------- /DYKitDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1DAE2CF01F5FC97200EE9905 /* EditActionsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DAE2CEE1F5FC97200EE9905 /* EditActionsViewController.m */; }; 11 | 1DAE2CF11F5FC97200EE9905 /* EditActionsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DAE2CEF1F5FC97200EE9905 /* EditActionsViewController.xib */; }; 12 | 1DAE2D011F62788200EE9905 /* DYTableViewRowAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DAE2D001F62788200EE9905 /* DYTableViewRowAction.m */; }; 13 | 1DAE2D051F66301D00EE9905 /* SectionsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DAE2D031F66301D00EE9905 /* SectionsViewController.m */; }; 14 | 1DAE2D061F66301D00EE9905 /* SectionsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DAE2D041F66301D00EE9905 /* SectionsViewController.xib */; }; 15 | 8D8A3769464DEA332C057D2C /* libPods-DYKitDemo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 73E844F4B5924AAEC7BA2DDF /* libPods-DYKitDemo.a */; }; 16 | E3518E981F106B86008534B1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E3518E971F106B86008534B1 /* main.m */; }; 17 | E3518E9B1F106B86008534B1 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E3518E9A1F106B86008534B1 /* AppDelegate.m */; }; 18 | E3518E9E1F106B86008534B1 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E3518E9D1F106B86008534B1 /* ViewController.m */; }; 19 | E3518EA11F106B86008534B1 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E3518E9F1F106B86008534B1 /* Main.storyboard */; }; 20 | E3518EA31F106B86008534B1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E3518EA21F106B86008534B1 /* Assets.xcassets */; }; 21 | E3518EA61F106B86008534B1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E3518EA41F106B86008534B1 /* LaunchScreen.storyboard */; }; 22 | E3518EB11F106B86008534B1 /* DYKitDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E3518EB01F106B86008534B1 /* DYKitDemoTests.m */; }; 23 | E35F5CEB1F205D52009ADC93 /* OneTypeCellViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E35F5CE91F205D52009ADC93 /* OneTypeCellViewController.m */; }; 24 | E35F5CEC1F205D52009ADC93 /* OneTypeCellViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35F5CEA1F205D52009ADC93 /* OneTypeCellViewController.xib */; }; 25 | E35F5CF01F207B06009ADC93 /* CellWithSectionAndRowViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E35F5CEE1F207B06009ADC93 /* CellWithSectionAndRowViewController.m */; }; 26 | E35F5CF11F207B06009ADC93 /* CellWithSectionAndRowViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35F5CEF1F207B06009ADC93 /* CellWithSectionAndRowViewController.xib */; }; 27 | E35F5CF51F209466009ADC93 /* CellWithSectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E35F5CF31F209466009ADC93 /* CellWithSectionViewController.m */; }; 28 | E35F5CF61F209466009ADC93 /* CellWithSectionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35F5CF41F209466009ADC93 /* CellWithSectionViewController.xib */; }; 29 | E35F5CFA1F209E72009ADC93 /* CellWithRowViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E35F5CF81F209E72009ADC93 /* CellWithRowViewController.m */; }; 30 | E35F5CFB1F209E72009ADC93 /* CellWithRowViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35F5CF91F209E72009ADC93 /* CellWithRowViewController.xib */; }; 31 | E36E5FF41F442BAB0029336A /* DataSlotForHeightViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E36E5FF21F442BAB0029336A /* DataSlotForHeightViewController.m */; }; 32 | E36E5FF51F442BAB0029336A /* DataSlotForHeightViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E36E5FF31F442BAB0029336A /* DataSlotForHeightViewController.xib */; }; 33 | E36E5FF91F4431E30029336A /* DYTableViewModule.m in Sources */ = {isa = PBXBuildFile; fileRef = E36E5FF81F4431E30029336A /* DYTableViewModule.m */; }; 34 | E374C2B21F14B432002D53B5 /* DYTableViewAgent.m in Sources */ = {isa = PBXBuildFile; fileRef = E374C2AE1F14B432002D53B5 /* DYTableViewAgent.m */; }; 35 | E374C2B31F14B432002D53B5 /* UITableView+DYTableViewBinder.m in Sources */ = {isa = PBXBuildFile; fileRef = E374C2B11F14B432002D53B5 /* UITableView+DYTableViewBinder.m */; }; 36 | E374C2B51F14B451002D53B5 /* DYKit.podspec in Resources */ = {isa = PBXBuildFile; fileRef = E374C2B41F14B451002D53B5 /* DYKit.podspec */; }; 37 | E3C024941F11831D0043DD8F /* OneTypeCellByNibTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E3C024921F11831D0043DD8F /* OneTypeCellByNibTableViewCell.m */; }; 38 | E3C024951F11831D0043DD8F /* OneTypeCellByNibTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E3C024931F11831D0043DD8F /* OneTypeCellByNibTableViewCell.xib */; }; 39 | E3C024981F1186D20043DD8F /* User.m in Sources */ = {isa = PBXBuildFile; fileRef = E3C024971F1186D20043DD8F /* User.m */; }; 40 | E3C0249E1F11DFED0043DD8F /* OneTypeCellByClassTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E3C0249D1F11DFED0043DD8F /* OneTypeCellByClassTableViewCell.m */; }; 41 | E3C024A71F11FE280043DD8F /* CellWithButtonByNibTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E3C024A51F11FE280043DD8F /* CellWithButtonByNibTableViewCell.m */; }; 42 | E3C024A81F11FE280043DD8F /* CellWithButtonByNibTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E3C024A61F11FE280043DD8F /* CellWithButtonByNibTableViewCell.xib */; }; 43 | E3C024C61F127BFD0043DD8F /* BlueTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E3C024C51F127BFD0043DD8F /* BlueTableViewCell.m */; }; 44 | E3DF6D291F277426000D3E29 /* DataSlotViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E3DF6D271F277426000D3E29 /* DataSlotViewController.m */; }; 45 | E3DF6D2A1F277426000D3E29 /* DataSlotViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E3DF6D281F277426000D3E29 /* DataSlotViewController.xib */; }; 46 | F3E5D61059E59339761F5566 /* libPods-DYKitDemoTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C40DCAC09DA2A7A20FC02D49 /* libPods-DYKitDemoTests.a */; }; 47 | /* End PBXBuildFile section */ 48 | 49 | /* Begin PBXContainerItemProxy section */ 50 | E3518EAD1F106B86008534B1 /* PBXContainerItemProxy */ = { 51 | isa = PBXContainerItemProxy; 52 | containerPortal = E3518E8B1F106B86008534B1 /* Project object */; 53 | proxyType = 1; 54 | remoteGlobalIDString = E3518E921F106B86008534B1; 55 | remoteInfo = DYKitDemo; 56 | }; 57 | /* End PBXContainerItemProxy section */ 58 | 59 | /* Begin PBXFileReference section */ 60 | 1DAE2CED1F5FC97200EE9905 /* EditActionsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditActionsViewController.h; sourceTree = ""; }; 61 | 1DAE2CEE1F5FC97200EE9905 /* EditActionsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EditActionsViewController.m; sourceTree = ""; }; 62 | 1DAE2CEF1F5FC97200EE9905 /* EditActionsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = EditActionsViewController.xib; sourceTree = ""; }; 63 | 1DAE2CFF1F62788200EE9905 /* DYTableViewRowAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DYTableViewRowAction.h; sourceTree = ""; }; 64 | 1DAE2D001F62788200EE9905 /* DYTableViewRowAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DYTableViewRowAction.m; sourceTree = ""; }; 65 | 1DAE2D021F66301D00EE9905 /* SectionsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SectionsViewController.h; sourceTree = ""; }; 66 | 1DAE2D031F66301D00EE9905 /* SectionsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SectionsViewController.m; sourceTree = ""; }; 67 | 1DAE2D041F66301D00EE9905 /* SectionsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SectionsViewController.xib; sourceTree = ""; }; 68 | 1E88DE23D6E7CA445E389098 /* Pods-DYKitDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DYKitDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-DYKitDemo/Pods-DYKitDemo.debug.xcconfig"; sourceTree = ""; }; 69 | 72A92E059309EAC795189F22 /* Pods-DYKitDemoTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DYKitDemoTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-DYKitDemoTests/Pods-DYKitDemoTests.release.xcconfig"; sourceTree = ""; }; 70 | 73E844F4B5924AAEC7BA2DDF /* libPods-DYKitDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-DYKitDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 71 | C40DCAC09DA2A7A20FC02D49 /* libPods-DYKitDemoTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-DYKitDemoTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 72 | CB12A7CD13CFE9BEB9BBC3AE /* Pods-DYKitDemoTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DYKitDemoTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-DYKitDemoTests/Pods-DYKitDemoTests.debug.xcconfig"; sourceTree = ""; }; 73 | E3518E931F106B86008534B1 /* DYKitDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DYKitDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 74 | E3518E971F106B86008534B1 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 75 | E3518E991F106B86008534B1 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 76 | E3518E9A1F106B86008534B1 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 77 | E3518E9C1F106B86008534B1 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 78 | E3518E9D1F106B86008534B1 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 79 | E3518EA01F106B86008534B1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 80 | E3518EA21F106B86008534B1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 81 | E3518EA51F106B86008534B1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 82 | E3518EA71F106B86008534B1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 83 | E3518EAC1F106B86008534B1 /* DYKitDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DYKitDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 84 | E3518EB01F106B86008534B1 /* DYKitDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DYKitDemoTests.m; sourceTree = ""; }; 85 | E3518EB21F106B86008534B1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 86 | E35F5CE81F205D52009ADC93 /* OneTypeCellViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OneTypeCellViewController.h; sourceTree = ""; }; 87 | E35F5CE91F205D52009ADC93 /* OneTypeCellViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OneTypeCellViewController.m; sourceTree = ""; }; 88 | E35F5CEA1F205D52009ADC93 /* OneTypeCellViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OneTypeCellViewController.xib; sourceTree = ""; }; 89 | E35F5CED1F207B06009ADC93 /* CellWithSectionAndRowViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CellWithSectionAndRowViewController.h; sourceTree = ""; }; 90 | E35F5CEE1F207B06009ADC93 /* CellWithSectionAndRowViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CellWithSectionAndRowViewController.m; sourceTree = ""; }; 91 | E35F5CEF1F207B06009ADC93 /* CellWithSectionAndRowViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CellWithSectionAndRowViewController.xib; sourceTree = ""; }; 92 | E35F5CF21F209466009ADC93 /* CellWithSectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CellWithSectionViewController.h; sourceTree = ""; }; 93 | E35F5CF31F209466009ADC93 /* CellWithSectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CellWithSectionViewController.m; sourceTree = ""; }; 94 | E35F5CF41F209466009ADC93 /* CellWithSectionViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CellWithSectionViewController.xib; sourceTree = ""; }; 95 | E35F5CF71F209E72009ADC93 /* CellWithRowViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CellWithRowViewController.h; sourceTree = ""; }; 96 | E35F5CF81F209E72009ADC93 /* CellWithRowViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CellWithRowViewController.m; sourceTree = ""; }; 97 | E35F5CF91F209E72009ADC93 /* CellWithRowViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CellWithRowViewController.xib; sourceTree = ""; }; 98 | E35F5CFC1F20A084009ADC93 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 99 | E36E5FF11F442BAB0029336A /* DataSlotForHeightViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataSlotForHeightViewController.h; sourceTree = ""; }; 100 | E36E5FF21F442BAB0029336A /* DataSlotForHeightViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DataSlotForHeightViewController.m; sourceTree = ""; }; 101 | E36E5FF31F442BAB0029336A /* DataSlotForHeightViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DataSlotForHeightViewController.xib; sourceTree = ""; }; 102 | E36E5FF61F442FC40029336A /* DYMacro.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DYMacro.h; sourceTree = ""; }; 103 | E36E5FF71F4431E30029336A /* DYTableViewModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DYTableViewModule.h; sourceTree = ""; }; 104 | E36E5FF81F4431E30029336A /* DYTableViewModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DYTableViewModule.m; sourceTree = ""; }; 105 | E374C2AD1F14B432002D53B5 /* DYTableViewAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DYTableViewAgent.h; sourceTree = ""; }; 106 | E374C2AE1F14B432002D53B5 /* DYTableViewAgent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DYTableViewAgent.m; sourceTree = ""; }; 107 | E374C2B01F14B432002D53B5 /* UITableView+DYTableViewBinder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITableView+DYTableViewBinder.h"; sourceTree = ""; }; 108 | E374C2B11F14B432002D53B5 /* UITableView+DYTableViewBinder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITableView+DYTableViewBinder.m"; sourceTree = ""; }; 109 | E374C2B41F14B451002D53B5 /* DYKit.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DYKit.podspec; sourceTree = ""; }; 110 | E374C2B61F14B46D002D53B5 /* DYKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DYKit.h; sourceTree = ""; }; 111 | E3C024911F11831D0043DD8F /* OneTypeCellByNibTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OneTypeCellByNibTableViewCell.h; sourceTree = ""; }; 112 | E3C024921F11831D0043DD8F /* OneTypeCellByNibTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OneTypeCellByNibTableViewCell.m; sourceTree = ""; }; 113 | E3C024931F11831D0043DD8F /* OneTypeCellByNibTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OneTypeCellByNibTableViewCell.xib; sourceTree = ""; }; 114 | E3C024961F1186D20043DD8F /* User.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = User.h; sourceTree = ""; }; 115 | E3C024971F1186D20043DD8F /* User.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = User.m; sourceTree = ""; }; 116 | E3C0249C1F11DFED0043DD8F /* OneTypeCellByClassTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OneTypeCellByClassTableViewCell.h; sourceTree = ""; }; 117 | E3C0249D1F11DFED0043DD8F /* OneTypeCellByClassTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OneTypeCellByClassTableViewCell.m; sourceTree = ""; }; 118 | E3C024A41F11FE280043DD8F /* CellWithButtonByNibTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CellWithButtonByNibTableViewCell.h; sourceTree = ""; }; 119 | E3C024A51F11FE280043DD8F /* CellWithButtonByNibTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CellWithButtonByNibTableViewCell.m; sourceTree = ""; }; 120 | E3C024A61F11FE280043DD8F /* CellWithButtonByNibTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CellWithButtonByNibTableViewCell.xib; sourceTree = ""; }; 121 | E3C024C41F127BFD0043DD8F /* BlueTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlueTableViewCell.h; sourceTree = ""; }; 122 | E3C024C51F127BFD0043DD8F /* BlueTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BlueTableViewCell.m; sourceTree = ""; }; 123 | E3DF6D261F277426000D3E29 /* DataSlotViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataSlotViewController.h; sourceTree = ""; }; 124 | E3DF6D271F277426000D3E29 /* DataSlotViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DataSlotViewController.m; sourceTree = ""; }; 125 | E3DF6D281F277426000D3E29 /* DataSlotViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DataSlotViewController.xib; sourceTree = ""; }; 126 | FCC7EA0B3413388469B9EEBA /* Pods-DYKitDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DYKitDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-DYKitDemo/Pods-DYKitDemo.release.xcconfig"; sourceTree = ""; }; 127 | /* End PBXFileReference section */ 128 | 129 | /* Begin PBXFrameworksBuildPhase section */ 130 | E3518E901F106B86008534B1 /* Frameworks */ = { 131 | isa = PBXFrameworksBuildPhase; 132 | buildActionMask = 2147483647; 133 | files = ( 134 | 8D8A3769464DEA332C057D2C /* libPods-DYKitDemo.a in Frameworks */, 135 | ); 136 | runOnlyForDeploymentPostprocessing = 0; 137 | }; 138 | E3518EA91F106B86008534B1 /* Frameworks */ = { 139 | isa = PBXFrameworksBuildPhase; 140 | buildActionMask = 2147483647; 141 | files = ( 142 | F3E5D61059E59339761F5566 /* libPods-DYKitDemoTests.a in Frameworks */, 143 | ); 144 | runOnlyForDeploymentPostprocessing = 0; 145 | }; 146 | /* End PBXFrameworksBuildPhase section */ 147 | 148 | /* Begin PBXGroup section */ 149 | 2A23E129A1489ECCDC4E73E4 /* Frameworks */ = { 150 | isa = PBXGroup; 151 | children = ( 152 | 73E844F4B5924AAEC7BA2DDF /* libPods-DYKitDemo.a */, 153 | C40DCAC09DA2A7A20FC02D49 /* libPods-DYKitDemoTests.a */, 154 | ); 155 | name = Frameworks; 156 | sourceTree = ""; 157 | }; 158 | 90B4662C78221F45B37557E1 /* Pods */ = { 159 | isa = PBXGroup; 160 | children = ( 161 | 1E88DE23D6E7CA445E389098 /* Pods-DYKitDemo.debug.xcconfig */, 162 | FCC7EA0B3413388469B9EEBA /* Pods-DYKitDemo.release.xcconfig */, 163 | CB12A7CD13CFE9BEB9BBC3AE /* Pods-DYKitDemoTests.debug.xcconfig */, 164 | 72A92E059309EAC795189F22 /* Pods-DYKitDemoTests.release.xcconfig */, 165 | ); 166 | name = Pods; 167 | sourceTree = ""; 168 | }; 169 | E3518E8A1F106B86008534B1 = { 170 | isa = PBXGroup; 171 | children = ( 172 | E35F5CFC1F20A084009ADC93 /* README.md */, 173 | E374C2B41F14B451002D53B5 /* DYKit.podspec */, 174 | E374C2AC1F14B432002D53B5 /* DYKit */, 175 | E3518E951F106B86008534B1 /* DYKitDemo */, 176 | E3518EAF1F106B86008534B1 /* DYKitDemoTests */, 177 | E3518E941F106B86008534B1 /* Products */, 178 | 90B4662C78221F45B37557E1 /* Pods */, 179 | 2A23E129A1489ECCDC4E73E4 /* Frameworks */, 180 | ); 181 | sourceTree = ""; 182 | }; 183 | E3518E941F106B86008534B1 /* Products */ = { 184 | isa = PBXGroup; 185 | children = ( 186 | E3518E931F106B86008534B1 /* DYKitDemo.app */, 187 | E3518EAC1F106B86008534B1 /* DYKitDemoTests.xctest */, 188 | ); 189 | name = Products; 190 | sourceTree = ""; 191 | }; 192 | E3518E951F106B86008534B1 /* DYKitDemo */ = { 193 | isa = PBXGroup; 194 | children = ( 195 | E3C024871F1180B20043DD8F /* module */, 196 | E3518E991F106B86008534B1 /* AppDelegate.h */, 197 | E3518E9A1F106B86008534B1 /* AppDelegate.m */, 198 | E3518E9C1F106B86008534B1 /* ViewController.h */, 199 | E3518E9D1F106B86008534B1 /* ViewController.m */, 200 | E3518E9F1F106B86008534B1 /* Main.storyboard */, 201 | E3518EA21F106B86008534B1 /* Assets.xcassets */, 202 | E3518EA41F106B86008534B1 /* LaunchScreen.storyboard */, 203 | E3518EA71F106B86008534B1 /* Info.plist */, 204 | E3518E961F106B86008534B1 /* Supporting Files */, 205 | ); 206 | path = DYKitDemo; 207 | sourceTree = ""; 208 | }; 209 | E3518E961F106B86008534B1 /* Supporting Files */ = { 210 | isa = PBXGroup; 211 | children = ( 212 | E3518E971F106B86008534B1 /* main.m */, 213 | ); 214 | name = "Supporting Files"; 215 | sourceTree = ""; 216 | }; 217 | E3518EAF1F106B86008534B1 /* DYKitDemoTests */ = { 218 | isa = PBXGroup; 219 | children = ( 220 | E3518EB01F106B86008534B1 /* DYKitDemoTests.m */, 221 | E3518EB21F106B86008534B1 /* Info.plist */, 222 | ); 223 | path = DYKitDemoTests; 224 | sourceTree = ""; 225 | }; 226 | E374C2AC1F14B432002D53B5 /* DYKit */ = { 227 | isa = PBXGroup; 228 | children = ( 229 | E374C2B61F14B46D002D53B5 /* DYKit.h */, 230 | E36E5FF61F442FC40029336A /* DYMacro.h */, 231 | E374C2AD1F14B432002D53B5 /* DYTableViewAgent.h */, 232 | E374C2AE1F14B432002D53B5 /* DYTableViewAgent.m */, 233 | E36E5FF71F4431E30029336A /* DYTableViewModule.h */, 234 | E36E5FF81F4431E30029336A /* DYTableViewModule.m */, 235 | E374C2B01F14B432002D53B5 /* UITableView+DYTableViewBinder.h */, 236 | E374C2B11F14B432002D53B5 /* UITableView+DYTableViewBinder.m */, 237 | 1DAE2CFF1F62788200EE9905 /* DYTableViewRowAction.h */, 238 | 1DAE2D001F62788200EE9905 /* DYTableViewRowAction.m */, 239 | ); 240 | path = DYKit; 241 | sourceTree = ""; 242 | }; 243 | E3C024871F1180B20043DD8F /* module */ = { 244 | isa = PBXGroup; 245 | children = ( 246 | E3C024881F1180B20043DD8F /* controller */, 247 | E3C024891F1180B20043DD8F /* model */, 248 | E3C0248A1F1180B20043DD8F /* view */, 249 | ); 250 | path = module; 251 | sourceTree = ""; 252 | }; 253 | E3C024881F1180B20043DD8F /* controller */ = { 254 | isa = PBXGroup; 255 | children = ( 256 | E35F5CE81F205D52009ADC93 /* OneTypeCellViewController.h */, 257 | E35F5CE91F205D52009ADC93 /* OneTypeCellViewController.m */, 258 | E35F5CEA1F205D52009ADC93 /* OneTypeCellViewController.xib */, 259 | E35F5CED1F207B06009ADC93 /* CellWithSectionAndRowViewController.h */, 260 | E35F5CEE1F207B06009ADC93 /* CellWithSectionAndRowViewController.m */, 261 | E35F5CEF1F207B06009ADC93 /* CellWithSectionAndRowViewController.xib */, 262 | E35F5CF21F209466009ADC93 /* CellWithSectionViewController.h */, 263 | E35F5CF31F209466009ADC93 /* CellWithSectionViewController.m */, 264 | E35F5CF41F209466009ADC93 /* CellWithSectionViewController.xib */, 265 | E35F5CF71F209E72009ADC93 /* CellWithRowViewController.h */, 266 | E35F5CF81F209E72009ADC93 /* CellWithRowViewController.m */, 267 | E35F5CF91F209E72009ADC93 /* CellWithRowViewController.xib */, 268 | E3DF6D261F277426000D3E29 /* DataSlotViewController.h */, 269 | E3DF6D271F277426000D3E29 /* DataSlotViewController.m */, 270 | E3DF6D281F277426000D3E29 /* DataSlotViewController.xib */, 271 | E36E5FF11F442BAB0029336A /* DataSlotForHeightViewController.h */, 272 | E36E5FF21F442BAB0029336A /* DataSlotForHeightViewController.m */, 273 | E36E5FF31F442BAB0029336A /* DataSlotForHeightViewController.xib */, 274 | 1DAE2CED1F5FC97200EE9905 /* EditActionsViewController.h */, 275 | 1DAE2CEE1F5FC97200EE9905 /* EditActionsViewController.m */, 276 | 1DAE2CEF1F5FC97200EE9905 /* EditActionsViewController.xib */, 277 | 1DAE2D021F66301D00EE9905 /* SectionsViewController.h */, 278 | 1DAE2D031F66301D00EE9905 /* SectionsViewController.m */, 279 | 1DAE2D041F66301D00EE9905 /* SectionsViewController.xib */, 280 | ); 281 | path = controller; 282 | sourceTree = ""; 283 | }; 284 | E3C024891F1180B20043DD8F /* model */ = { 285 | isa = PBXGroup; 286 | children = ( 287 | E3C024961F1186D20043DD8F /* User.h */, 288 | E3C024971F1186D20043DD8F /* User.m */, 289 | ); 290 | path = model; 291 | sourceTree = ""; 292 | }; 293 | E3C0248A1F1180B20043DD8F /* view */ = { 294 | isa = PBXGroup; 295 | children = ( 296 | E3C024911F11831D0043DD8F /* OneTypeCellByNibTableViewCell.h */, 297 | E3C024921F11831D0043DD8F /* OneTypeCellByNibTableViewCell.m */, 298 | E3C024931F11831D0043DD8F /* OneTypeCellByNibTableViewCell.xib */, 299 | E3C0249C1F11DFED0043DD8F /* OneTypeCellByClassTableViewCell.h */, 300 | E3C0249D1F11DFED0043DD8F /* OneTypeCellByClassTableViewCell.m */, 301 | E3C024A41F11FE280043DD8F /* CellWithButtonByNibTableViewCell.h */, 302 | E3C024A51F11FE280043DD8F /* CellWithButtonByNibTableViewCell.m */, 303 | E3C024A61F11FE280043DD8F /* CellWithButtonByNibTableViewCell.xib */, 304 | E3C024C41F127BFD0043DD8F /* BlueTableViewCell.h */, 305 | E3C024C51F127BFD0043DD8F /* BlueTableViewCell.m */, 306 | ); 307 | path = view; 308 | sourceTree = ""; 309 | }; 310 | /* End PBXGroup section */ 311 | 312 | /* Begin PBXNativeTarget section */ 313 | E3518E921F106B86008534B1 /* DYKitDemo */ = { 314 | isa = PBXNativeTarget; 315 | buildConfigurationList = E3518EB51F106B86008534B1 /* Build configuration list for PBXNativeTarget "DYKitDemo" */; 316 | buildPhases = ( 317 | 39EA5B64AB302CEFFD88578E /* [CP] Check Pods Manifest.lock */, 318 | E3518E8F1F106B86008534B1 /* Sources */, 319 | E3518E901F106B86008534B1 /* Frameworks */, 320 | E3518E911F106B86008534B1 /* Resources */, 321 | 9DC4383A2DC24AC9CCD99786 /* [CP] Embed Pods Frameworks */, 322 | 6C1E46DA4974D4A0162ADA8E /* [CP] Copy Pods Resources */, 323 | ); 324 | buildRules = ( 325 | ); 326 | dependencies = ( 327 | ); 328 | name = DYKitDemo; 329 | productName = DYKitDemo; 330 | productReference = E3518E931F106B86008534B1 /* DYKitDemo.app */; 331 | productType = "com.apple.product-type.application"; 332 | }; 333 | E3518EAB1F106B86008534B1 /* DYKitDemoTests */ = { 334 | isa = PBXNativeTarget; 335 | buildConfigurationList = E3518EB81F106B86008534B1 /* Build configuration list for PBXNativeTarget "DYKitDemoTests" */; 336 | buildPhases = ( 337 | AEE192114B554786329685EE /* [CP] Check Pods Manifest.lock */, 338 | E3518EA81F106B86008534B1 /* Sources */, 339 | E3518EA91F106B86008534B1 /* Frameworks */, 340 | E3518EAA1F106B86008534B1 /* Resources */, 341 | 10ABBCCD0CD0E73B5C646E22 /* [CP] Embed Pods Frameworks */, 342 | 5E9D161FAA82DE4C15F128AD /* [CP] Copy Pods Resources */, 343 | ); 344 | buildRules = ( 345 | ); 346 | dependencies = ( 347 | E3518EAE1F106B86008534B1 /* PBXTargetDependency */, 348 | ); 349 | name = DYKitDemoTests; 350 | productName = DYKitDemoTests; 351 | productReference = E3518EAC1F106B86008534B1 /* DYKitDemoTests.xctest */; 352 | productType = "com.apple.product-type.bundle.unit-test"; 353 | }; 354 | /* End PBXNativeTarget section */ 355 | 356 | /* Begin PBXProject section */ 357 | E3518E8B1F106B86008534B1 /* Project object */ = { 358 | isa = PBXProject; 359 | attributes = { 360 | LastUpgradeCheck = 0830; 361 | ORGANIZATIONNAME = DuYe; 362 | TargetAttributes = { 363 | E3518E921F106B86008534B1 = { 364 | CreatedOnToolsVersion = 8.3.3; 365 | DevelopmentTeam = MU3P497PKC; 366 | ProvisioningStyle = Automatic; 367 | }; 368 | E3518EAB1F106B86008534B1 = { 369 | CreatedOnToolsVersion = 8.3.3; 370 | ProvisioningStyle = Automatic; 371 | TestTargetID = E3518E921F106B86008534B1; 372 | }; 373 | }; 374 | }; 375 | buildConfigurationList = E3518E8E1F106B86008534B1 /* Build configuration list for PBXProject "DYKitDemo" */; 376 | compatibilityVersion = "Xcode 3.2"; 377 | developmentRegion = English; 378 | hasScannedForEncodings = 0; 379 | knownRegions = ( 380 | en, 381 | Base, 382 | ); 383 | mainGroup = E3518E8A1F106B86008534B1; 384 | productRefGroup = E3518E941F106B86008534B1 /* Products */; 385 | projectDirPath = ""; 386 | projectRoot = ""; 387 | targets = ( 388 | E3518E921F106B86008534B1 /* DYKitDemo */, 389 | E3518EAB1F106B86008534B1 /* DYKitDemoTests */, 390 | ); 391 | }; 392 | /* End PBXProject section */ 393 | 394 | /* Begin PBXResourcesBuildPhase section */ 395 | E3518E911F106B86008534B1 /* Resources */ = { 396 | isa = PBXResourcesBuildPhase; 397 | buildActionMask = 2147483647; 398 | files = ( 399 | E374C2B51F14B451002D53B5 /* DYKit.podspec in Resources */, 400 | E3518EA61F106B86008534B1 /* LaunchScreen.storyboard in Resources */, 401 | 1DAE2D061F66301D00EE9905 /* SectionsViewController.xib in Resources */, 402 | E35F5CF61F209466009ADC93 /* CellWithSectionViewController.xib in Resources */, 403 | E36E5FF51F442BAB0029336A /* DataSlotForHeightViewController.xib in Resources */, 404 | E3C024A81F11FE280043DD8F /* CellWithButtonByNibTableViewCell.xib in Resources */, 405 | E35F5CF11F207B06009ADC93 /* CellWithSectionAndRowViewController.xib in Resources */, 406 | E3518EA31F106B86008534B1 /* Assets.xcassets in Resources */, 407 | E35F5CEC1F205D52009ADC93 /* OneTypeCellViewController.xib in Resources */, 408 | E3DF6D2A1F277426000D3E29 /* DataSlotViewController.xib in Resources */, 409 | 1DAE2CF11F5FC97200EE9905 /* EditActionsViewController.xib in Resources */, 410 | E35F5CFB1F209E72009ADC93 /* CellWithRowViewController.xib in Resources */, 411 | E3C024951F11831D0043DD8F /* OneTypeCellByNibTableViewCell.xib in Resources */, 412 | E3518EA11F106B86008534B1 /* Main.storyboard in Resources */, 413 | ); 414 | runOnlyForDeploymentPostprocessing = 0; 415 | }; 416 | E3518EAA1F106B86008534B1 /* Resources */ = { 417 | isa = PBXResourcesBuildPhase; 418 | buildActionMask = 2147483647; 419 | files = ( 420 | ); 421 | runOnlyForDeploymentPostprocessing = 0; 422 | }; 423 | /* End PBXResourcesBuildPhase section */ 424 | 425 | /* Begin PBXShellScriptBuildPhase section */ 426 | 10ABBCCD0CD0E73B5C646E22 /* [CP] Embed Pods Frameworks */ = { 427 | isa = PBXShellScriptBuildPhase; 428 | buildActionMask = 2147483647; 429 | files = ( 430 | ); 431 | inputPaths = ( 432 | ); 433 | name = "[CP] Embed Pods Frameworks"; 434 | outputPaths = ( 435 | ); 436 | runOnlyForDeploymentPostprocessing = 0; 437 | shellPath = /bin/sh; 438 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-DYKitDemoTests/Pods-DYKitDemoTests-frameworks.sh\"\n"; 439 | showEnvVarsInLog = 0; 440 | }; 441 | 39EA5B64AB302CEFFD88578E /* [CP] Check Pods Manifest.lock */ = { 442 | isa = PBXShellScriptBuildPhase; 443 | buildActionMask = 2147483647; 444 | files = ( 445 | ); 446 | inputPaths = ( 447 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 448 | "${PODS_ROOT}/Manifest.lock", 449 | ); 450 | name = "[CP] Check Pods Manifest.lock"; 451 | outputPaths = ( 452 | "$(DERIVED_FILE_DIR)/Pods-DYKitDemo-checkManifestLockResult.txt", 453 | ); 454 | runOnlyForDeploymentPostprocessing = 0; 455 | shellPath = /bin/sh; 456 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 457 | showEnvVarsInLog = 0; 458 | }; 459 | 5E9D161FAA82DE4C15F128AD /* [CP] Copy Pods Resources */ = { 460 | isa = PBXShellScriptBuildPhase; 461 | buildActionMask = 2147483647; 462 | files = ( 463 | ); 464 | inputPaths = ( 465 | ); 466 | name = "[CP] Copy Pods Resources"; 467 | outputPaths = ( 468 | ); 469 | runOnlyForDeploymentPostprocessing = 0; 470 | shellPath = /bin/sh; 471 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-DYKitDemoTests/Pods-DYKitDemoTests-resources.sh\"\n"; 472 | showEnvVarsInLog = 0; 473 | }; 474 | 6C1E46DA4974D4A0162ADA8E /* [CP] Copy Pods Resources */ = { 475 | isa = PBXShellScriptBuildPhase; 476 | buildActionMask = 2147483647; 477 | files = ( 478 | ); 479 | inputPaths = ( 480 | ); 481 | name = "[CP] Copy Pods Resources"; 482 | outputPaths = ( 483 | ); 484 | runOnlyForDeploymentPostprocessing = 0; 485 | shellPath = /bin/sh; 486 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-DYKitDemo/Pods-DYKitDemo-resources.sh\"\n"; 487 | showEnvVarsInLog = 0; 488 | }; 489 | 9DC4383A2DC24AC9CCD99786 /* [CP] Embed Pods Frameworks */ = { 490 | isa = PBXShellScriptBuildPhase; 491 | buildActionMask = 2147483647; 492 | files = ( 493 | ); 494 | inputPaths = ( 495 | ); 496 | name = "[CP] Embed Pods Frameworks"; 497 | outputPaths = ( 498 | ); 499 | runOnlyForDeploymentPostprocessing = 0; 500 | shellPath = /bin/sh; 501 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-DYKitDemo/Pods-DYKitDemo-frameworks.sh\"\n"; 502 | showEnvVarsInLog = 0; 503 | }; 504 | AEE192114B554786329685EE /* [CP] Check Pods Manifest.lock */ = { 505 | isa = PBXShellScriptBuildPhase; 506 | buildActionMask = 2147483647; 507 | files = ( 508 | ); 509 | inputPaths = ( 510 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 511 | "${PODS_ROOT}/Manifest.lock", 512 | ); 513 | name = "[CP] Check Pods Manifest.lock"; 514 | outputPaths = ( 515 | "$(DERIVED_FILE_DIR)/Pods-DYKitDemoTests-checkManifestLockResult.txt", 516 | ); 517 | runOnlyForDeploymentPostprocessing = 0; 518 | shellPath = /bin/sh; 519 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 520 | showEnvVarsInLog = 0; 521 | }; 522 | /* End PBXShellScriptBuildPhase section */ 523 | 524 | /* Begin PBXSourcesBuildPhase section */ 525 | E3518E8F1F106B86008534B1 /* Sources */ = { 526 | isa = PBXSourcesBuildPhase; 527 | buildActionMask = 2147483647; 528 | files = ( 529 | E3C024981F1186D20043DD8F /* User.m in Sources */, 530 | E35F5CFA1F209E72009ADC93 /* CellWithRowViewController.m in Sources */, 531 | 1DAE2D011F62788200EE9905 /* DYTableViewRowAction.m in Sources */, 532 | E3518E9E1F106B86008534B1 /* ViewController.m in Sources */, 533 | E374C2B31F14B432002D53B5 /* UITableView+DYTableViewBinder.m in Sources */, 534 | E36E5FF91F4431E30029336A /* DYTableViewModule.m in Sources */, 535 | E35F5CEB1F205D52009ADC93 /* OneTypeCellViewController.m in Sources */, 536 | E36E5FF41F442BAB0029336A /* DataSlotForHeightViewController.m in Sources */, 537 | E3C024C61F127BFD0043DD8F /* BlueTableViewCell.m in Sources */, 538 | 1DAE2CF01F5FC97200EE9905 /* EditActionsViewController.m in Sources */, 539 | E3C024941F11831D0043DD8F /* OneTypeCellByNibTableViewCell.m in Sources */, 540 | E3518E9B1F106B86008534B1 /* AppDelegate.m in Sources */, 541 | E35F5CF01F207B06009ADC93 /* CellWithSectionAndRowViewController.m in Sources */, 542 | E3C024A71F11FE280043DD8F /* CellWithButtonByNibTableViewCell.m in Sources */, 543 | 1DAE2D051F66301D00EE9905 /* SectionsViewController.m in Sources */, 544 | E374C2B21F14B432002D53B5 /* DYTableViewAgent.m in Sources */, 545 | E3C0249E1F11DFED0043DD8F /* OneTypeCellByClassTableViewCell.m in Sources */, 546 | E35F5CF51F209466009ADC93 /* CellWithSectionViewController.m in Sources */, 547 | E3DF6D291F277426000D3E29 /* DataSlotViewController.m in Sources */, 548 | E3518E981F106B86008534B1 /* main.m in Sources */, 549 | ); 550 | runOnlyForDeploymentPostprocessing = 0; 551 | }; 552 | E3518EA81F106B86008534B1 /* Sources */ = { 553 | isa = PBXSourcesBuildPhase; 554 | buildActionMask = 2147483647; 555 | files = ( 556 | E3518EB11F106B86008534B1 /* DYKitDemoTests.m in Sources */, 557 | ); 558 | runOnlyForDeploymentPostprocessing = 0; 559 | }; 560 | /* End PBXSourcesBuildPhase section */ 561 | 562 | /* Begin PBXTargetDependency section */ 563 | E3518EAE1F106B86008534B1 /* PBXTargetDependency */ = { 564 | isa = PBXTargetDependency; 565 | target = E3518E921F106B86008534B1 /* DYKitDemo */; 566 | targetProxy = E3518EAD1F106B86008534B1 /* PBXContainerItemProxy */; 567 | }; 568 | /* End PBXTargetDependency section */ 569 | 570 | /* Begin PBXVariantGroup section */ 571 | E3518E9F1F106B86008534B1 /* Main.storyboard */ = { 572 | isa = PBXVariantGroup; 573 | children = ( 574 | E3518EA01F106B86008534B1 /* Base */, 575 | ); 576 | name = Main.storyboard; 577 | sourceTree = ""; 578 | }; 579 | E3518EA41F106B86008534B1 /* LaunchScreen.storyboard */ = { 580 | isa = PBXVariantGroup; 581 | children = ( 582 | E3518EA51F106B86008534B1 /* Base */, 583 | ); 584 | name = LaunchScreen.storyboard; 585 | sourceTree = ""; 586 | }; 587 | /* End PBXVariantGroup section */ 588 | 589 | /* Begin XCBuildConfiguration section */ 590 | E3518EB31F106B86008534B1 /* Debug */ = { 591 | isa = XCBuildConfiguration; 592 | buildSettings = { 593 | ALWAYS_SEARCH_USER_PATHS = NO; 594 | CLANG_ANALYZER_NONNULL = YES; 595 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 596 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 597 | CLANG_CXX_LIBRARY = "libc++"; 598 | CLANG_ENABLE_MODULES = YES; 599 | CLANG_ENABLE_OBJC_ARC = YES; 600 | CLANG_WARN_BOOL_CONVERSION = YES; 601 | CLANG_WARN_CONSTANT_CONVERSION = YES; 602 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 603 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 604 | CLANG_WARN_EMPTY_BODY = YES; 605 | CLANG_WARN_ENUM_CONVERSION = YES; 606 | CLANG_WARN_INFINITE_RECURSION = YES; 607 | CLANG_WARN_INT_CONVERSION = YES; 608 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 609 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 610 | CLANG_WARN_UNREACHABLE_CODE = YES; 611 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 612 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 613 | COPY_PHASE_STRIP = NO; 614 | DEBUG_INFORMATION_FORMAT = dwarf; 615 | ENABLE_STRICT_OBJC_MSGSEND = YES; 616 | ENABLE_TESTABILITY = YES; 617 | GCC_C_LANGUAGE_STANDARD = gnu99; 618 | GCC_DYNAMIC_NO_PIC = NO; 619 | GCC_NO_COMMON_BLOCKS = YES; 620 | GCC_OPTIMIZATION_LEVEL = 0; 621 | GCC_PREPROCESSOR_DEFINITIONS = ( 622 | "DEBUG=1", 623 | "$(inherited)", 624 | ); 625 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 626 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 627 | GCC_WARN_UNDECLARED_SELECTOR = YES; 628 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 629 | GCC_WARN_UNUSED_FUNCTION = YES; 630 | GCC_WARN_UNUSED_VARIABLE = YES; 631 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 632 | MTL_ENABLE_DEBUG_INFO = YES; 633 | ONLY_ACTIVE_ARCH = YES; 634 | SDKROOT = iphoneos; 635 | TARGETED_DEVICE_FAMILY = "1,2"; 636 | }; 637 | name = Debug; 638 | }; 639 | E3518EB41F106B86008534B1 /* Release */ = { 640 | isa = XCBuildConfiguration; 641 | buildSettings = { 642 | ALWAYS_SEARCH_USER_PATHS = NO; 643 | CLANG_ANALYZER_NONNULL = YES; 644 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 645 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 646 | CLANG_CXX_LIBRARY = "libc++"; 647 | CLANG_ENABLE_MODULES = YES; 648 | CLANG_ENABLE_OBJC_ARC = YES; 649 | CLANG_WARN_BOOL_CONVERSION = YES; 650 | CLANG_WARN_CONSTANT_CONVERSION = YES; 651 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 652 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 653 | CLANG_WARN_EMPTY_BODY = YES; 654 | CLANG_WARN_ENUM_CONVERSION = YES; 655 | CLANG_WARN_INFINITE_RECURSION = YES; 656 | CLANG_WARN_INT_CONVERSION = YES; 657 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 658 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 659 | CLANG_WARN_UNREACHABLE_CODE = YES; 660 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 661 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 662 | COPY_PHASE_STRIP = NO; 663 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 664 | ENABLE_NS_ASSERTIONS = NO; 665 | ENABLE_STRICT_OBJC_MSGSEND = YES; 666 | GCC_C_LANGUAGE_STANDARD = gnu99; 667 | GCC_NO_COMMON_BLOCKS = YES; 668 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 669 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 670 | GCC_WARN_UNDECLARED_SELECTOR = YES; 671 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 672 | GCC_WARN_UNUSED_FUNCTION = YES; 673 | GCC_WARN_UNUSED_VARIABLE = YES; 674 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 675 | MTL_ENABLE_DEBUG_INFO = NO; 676 | SDKROOT = iphoneos; 677 | TARGETED_DEVICE_FAMILY = "1,2"; 678 | VALIDATE_PRODUCT = YES; 679 | }; 680 | name = Release; 681 | }; 682 | E3518EB61F106B86008534B1 /* Debug */ = { 683 | isa = XCBuildConfiguration; 684 | baseConfigurationReference = 1E88DE23D6E7CA445E389098 /* Pods-DYKitDemo.debug.xcconfig */; 685 | buildSettings = { 686 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 687 | DEVELOPMENT_TEAM = MU3P497PKC; 688 | INFOPLIST_FILE = DYKitDemo/Info.plist; 689 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 690 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 691 | PRODUCT_BUNDLE_IDENTIFIER = DY.DYKitDemo; 692 | PRODUCT_NAME = "$(TARGET_NAME)"; 693 | }; 694 | name = Debug; 695 | }; 696 | E3518EB71F106B86008534B1 /* Release */ = { 697 | isa = XCBuildConfiguration; 698 | baseConfigurationReference = FCC7EA0B3413388469B9EEBA /* Pods-DYKitDemo.release.xcconfig */; 699 | buildSettings = { 700 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 701 | DEVELOPMENT_TEAM = MU3P497PKC; 702 | INFOPLIST_FILE = DYKitDemo/Info.plist; 703 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 704 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 705 | PRODUCT_BUNDLE_IDENTIFIER = DY.DYKitDemo; 706 | PRODUCT_NAME = "$(TARGET_NAME)"; 707 | }; 708 | name = Release; 709 | }; 710 | E3518EB91F106B86008534B1 /* Debug */ = { 711 | isa = XCBuildConfiguration; 712 | baseConfigurationReference = CB12A7CD13CFE9BEB9BBC3AE /* Pods-DYKitDemoTests.debug.xcconfig */; 713 | buildSettings = { 714 | BUNDLE_LOADER = "$(TEST_HOST)"; 715 | INFOPLIST_FILE = DYKitDemoTests/Info.plist; 716 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 717 | PRODUCT_BUNDLE_IDENTIFIER = DY.DYKitDemoTests; 718 | PRODUCT_NAME = "$(TARGET_NAME)"; 719 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DYKitDemo.app/DYKitDemo"; 720 | }; 721 | name = Debug; 722 | }; 723 | E3518EBA1F106B86008534B1 /* Release */ = { 724 | isa = XCBuildConfiguration; 725 | baseConfigurationReference = 72A92E059309EAC795189F22 /* Pods-DYKitDemoTests.release.xcconfig */; 726 | buildSettings = { 727 | BUNDLE_LOADER = "$(TEST_HOST)"; 728 | INFOPLIST_FILE = DYKitDemoTests/Info.plist; 729 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 730 | PRODUCT_BUNDLE_IDENTIFIER = DY.DYKitDemoTests; 731 | PRODUCT_NAME = "$(TARGET_NAME)"; 732 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DYKitDemo.app/DYKitDemo"; 733 | }; 734 | name = Release; 735 | }; 736 | /* End XCBuildConfiguration section */ 737 | 738 | /* Begin XCConfigurationList section */ 739 | E3518E8E1F106B86008534B1 /* Build configuration list for PBXProject "DYKitDemo" */ = { 740 | isa = XCConfigurationList; 741 | buildConfigurations = ( 742 | E3518EB31F106B86008534B1 /* Debug */, 743 | E3518EB41F106B86008534B1 /* Release */, 744 | ); 745 | defaultConfigurationIsVisible = 0; 746 | defaultConfigurationName = Release; 747 | }; 748 | E3518EB51F106B86008534B1 /* Build configuration list for PBXNativeTarget "DYKitDemo" */ = { 749 | isa = XCConfigurationList; 750 | buildConfigurations = ( 751 | E3518EB61F106B86008534B1 /* Debug */, 752 | E3518EB71F106B86008534B1 /* Release */, 753 | ); 754 | defaultConfigurationIsVisible = 0; 755 | defaultConfigurationName = Release; 756 | }; 757 | E3518EB81F106B86008534B1 /* Build configuration list for PBXNativeTarget "DYKitDemoTests" */ = { 758 | isa = XCConfigurationList; 759 | buildConfigurations = ( 760 | E3518EB91F106B86008534B1 /* Debug */, 761 | E3518EBA1F106B86008534B1 /* Release */, 762 | ); 763 | defaultConfigurationIsVisible = 0; 764 | defaultConfigurationName = Release; 765 | }; 766 | /* End XCConfigurationList section */ 767 | }; 768 | rootObject = E3518E8B1F106B86008534B1 /* Project object */; 769 | } 770 | --------------------------------------------------------------------------------