DYKit

DYKit

CocoaPods 
CocoaPods 
Support 

DYKit是一套使用了ReactiveObjC的系统控件封装库

DYKit将UIkit中的大部分常用组件进行了封装,让这些控件不再使用delegate,datasource等而是可以通过block,RACSignal等形式进行控制,通过链式调用,很多控件从此可以通过一句代码完成。

sample

不需要delegate,datasource。你可以如此简单的创建一个tableView:

1
2
3
4
5
6
7
[self.homeTableView assemblyWithAssemblyBlock:^(UITableViewCell *cell, NSString *text, NSIndexPath *indexPath) {
//这个block充当了cellForRowAtIndexPath的作用
cell.textLabel.text = text;
}];
//设定数据
self.homeTableView.dy_data = @[@"标题1",@"标题2",@"标题3",@"标题4"];
  1. dy_data是一个NSArray的属性。你只能给他绑定发送NSArrayRACSignal.当然你也可以像下面这样直接给他赋值。
    self,homeTableView.dy_data = @[@"标题1",@"标题2",@"标题3",@"标题4"];
  2. dy_data中的每一个元素都会出现在上面那个assemblyWithAssemblyBlock中的第二个参数。你可以修改参数成任意类型,比如modelvideModel甚至是NSString

你可以使用下面的方法来创建不同类型的tableView:

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
[self.tableView assemblyByReuseIdentifier:@"OneTypeCellByNibTableViewCell" withAssemblyBlock:^(OneTypeCellByNibTableViewCell *cell, User *user, NSIndexPath *indexPath) {
cell.headImageView.image = [UIImage imageNamed:user.img];
cell.headImageView.backgroundColor = user.sex == 0 ? [UIColor purpleColor] : [UIColor blackColor];
cell.nameLabel.text = user.name;
cell.ageLabel.text = user.age;
cell.descLabel.text = user.desc;
}];
User *user1 = [User new];
User *user2 = [User new];
User *user3 = [User new];
user1.id = @"001";
user1.name = @"jack";
user1.img = @"head";
user1.age = @"29";
user1.desc = @"她喜欢黑色";
user1.sex = 0;
user2.id = @"002";
user2.name = @"Pink man";
user2.img = @"head";
user2.age = @"18";
user2.desc = @"白老师得意门生";
user2.sex = 1;
user3.id = @"003";
user3.name = @"MR.white";
user3.img = @"head";
user3.age = @"43";
user3.desc = @"平淡无奇的中学化学老师";
user3.sex = 1;
self.tableView.dy_data = @[user1,user2,user3];
  1. reuseIdentifier参数传入一个复用ID。用来自动注册cell和使用复用cell,可支持nib或class创建的cell。(优先寻找reuseIdentifier命名的xib文件,找到的情况下直接注册nibcell。找不到的情况下会使用reuseIdentifier作为类名的非nib创建cell)

当然你也可以使用下面这些方法来满足不同cell在同一个tableView或者不同的cetion下使用的需求

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
/**
指定section和row进行cell设定
@param identifier cell的重用ID(使用cell的类名,可以是xib或者class创建)
@param section 指定section位置
@param row 指定row位置
@param block cellForRowAtIndexPath的block
@return 返回自身,用于链式调用
*/
- (UITableView*) addReuseIdentifier:(NSString *)identifier FromSection:(int)section row:(int)row withAssemblyBlock:(AssemblyBlock)block;
/**
指定section进行cell设定。默认本section下的cell全部按照block内容进行设定
@param identifier cell的重用ID(使用cell的类名,可以是xib或者class创建)
@param section 指定section位置
@param block cellForRowAtIndexPath的block
@return 返回自身,用于链式调用
*/
- (UITableView*) addReuseIdentifier:(NSString *)identifier FromSection:(int)section withAssemblyBlock:(AssemblyBlock)block;
/**
指定row进行cell设定。默认只有一个section
@param identifier cell的重用ID(使用cell的类名,可以是xib或者class创建)
@param row 指定row位置
@param block cellForRowAtIndexPath的block
@return 返回自身,用于链式调用
*/
- (UITableView*) addReuseIdentifier:(NSString *)identifier FromRow:(int)row withAssemblyBlock:(AssemblyBlock)block;
/**
指定具体的indexPath进行cell设定,可选择任意位置
@param identifier cell的重用ID(使用cell的类名,可以是xib或者class创建)
@param slotBlock 用于指定具体条件的block。通过对参数的indexPath进行判断,返回需要的具体位置
@param cellBindBlock cellForRowAtIndexPath的block
@return 返回自身,用于链式调用
*/
- (UITableView*) addReuseIdentifier:(NSString *)identifier FromSlot:(SlotBlock)slotBlock withAssemblyBlock:(AssemblyBlock)cellBindBlock;

代理事件

你可以用这些方法获得你需要的代理事件的Signal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma delegate方法
- (RACSignal*)accessoryButtonTappedForRowWithIndexPathSignal;
- (RACSignal*)didEndDisplayingCellSignal;
- (RACSignal*)didEndDisplayingHeaderViewSignal;
- (RACSignal*)didEndDisplayingFooterViewSignal;
- (RACSignal*)didHighlightRowAtIndexPathSignal;
- (RACSignal*)didUnhighlightRowAtIndexPathSignal;
- (RACSignal*)didSelectRowAtIndexPathSignal;
- (RACSignal*)didDeselectRowAtIndexPathSignal;
- (RACSignal*)didEndEditingRowAtIndexPathSignal;
- (RACSignal*)didUpdateFocusInContextSignal;
- (RACSignal*)performActionSignal;
- (RACSignal*)willBeginEditingRowAtIndexPathSignal;
- (RACSignal*)willDisplayCellSignal;
- (RACSignal*)willDisplayHeaderViewSignal;
- (RACSignal*)willDisplayFooterViewSignal;
#pragma DataSource方法
- (RACSignal*)commitEditingStyleSignal;
- (RACSignal*)moveRowAtIndexPathSignal;

回调方法

你也可以通过传入block的方法来设置tableView的属性。名字和原来的那些一样

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
#pragma 配置用block
- (UITableView*)setHeightForRowAtIndexPath:(CGFloatTableViewIndexPath)block;
- (UITableView*)setEditActionsForRowAtIndexPath:(EditActionsForRowAtIndexPath)block;
- (UITableView*)setShouldHighlightRowAtIndexPath:(BOOLTableViewIndexPath)block;
- (UITableView*)setCanEditRowAtIndexPath:(BOOLTableViewIndexPath)block;
- (UITableView*)setNumberOfRowsInSection:(NSIntegerTableViewIndexPath)block;
//- (void)setCellForRowAtIndexPath:(UITableViewCellTableViewIndexPath)block;
- (UITableView*)setNumberOfSectionsInTableView:(NSIntegerUITableView)block;
- (UITableView*)setTitleForHeaderInSection:(NSStringTableViewNSInteger)block;
- (UITableView*)setTitleForFooterInSection:(NSStringTableViewNSInteger)block;
- (UITableView*)setCanMoveRowAtIndexPath:(BOOLTableViewIndexPath)block;
- (UITableView*)setSectionIndexTitlesForTableView:(SectionIndexTitlesForTableView)block;
- (UITableView*)setSectionForSectionIndexTitle:(NSIntegerUITableViewNSStringNSInteger)block;
- (UITableView*)setHeightForHeaderInSection:(CGFloatTableViewNSInteger)block;
- (UITableView*)setHeightForFooterInSection:(CGFloatTableViewNSInteger)block;
- (UITableView*)setEstimatedHeightForRowAtIndexPath:(CGFloatTableViewIndexPath)block;
- (UITableView*)setEstimatedHeightForHeaderInSection:(CGFloatTableViewNSInteger)block;
- (UITableView*)setEstimatedHeightForFooterInSection:(CGFloatTableViewNSInteger)block;
- (UITableView*)setViewForHeaderInSection:(UIViewTableViewNSInteger)block;
- (UITableView*)setViewForFooterInSection:(UIViewTableViewNSInteger)block;
- (UITableView*)setWillSelectRowAtIndexPath:(NSIndexPathUITableViewNSIndexPath)block;
- (UITableView*)setWillDeselectRowAtIndexPath:(NSIndexPathUITableViewNSIndexPath)block;
- (UITableView*)setEditingStyleForRowAtIndexPath:(UITableViewCellEditingStyleUITableViewNSIndexPath)block;
- (UITableView*)setTitleForDeleteConfirmationButtonForRowAtIndexPath:(NSStringTableViewIndexPath)block;
- (UITableView*)setShouldIndentWhileEditingRowAtIndexPath:(BOOLTableViewIndexPath)block;
- (UITableView*)setTargetIndexPathForMoveFromRowAtIndexPath:(NSIndexPathUITableViewNSIndexPathNSIndexPath)block;
- (UITableView*)setIndentationLevelForRowAtIndexPath:(NSIntegerUITableViewNSIndexPath)block;
- (UITableView*)setShouldShowMenuForRowAtIndexPath:(BOOLTableViewIndexPath)block;
- (UITableView*)setCanPerformAction:(BOOLUITableViewSELNSIndexPath)block;
- (UITableView*)setCanFocusRowAtIndexPath:(BOOLTableViewIndexPath)block;
- (UITableView*)setShouldUpdateFocusInContext:(BOOLUITableViewFocusUpdateContext)block;
- (UITableView*)setIndexPathForPreferredFocusedViewInTableView:(NSIndexPathUITableView)block;

安装

CocoaPods

  1. 在 Podfile 中添加 pod 'DYKit'
  2. 执行 pod installpod update
  3. 导入 \”DYKit.h\”。

将来

  1. 实现UIcollectionView的封装
  2. 实现UITextView的封装

系统要求

该项目最低支持 iOS 8.0

许可证

DYKit 使用 MIT 许可证,详情见 LICENSE 文件。