上一篇文章讲到了UITableView使用CHGAdapter框架来简单的编程(UITableView最简单的用法(CHGAdapter)),这一节我们讲一下如何优雅的将cell、headerView、footerView中的输入事件传递到Controller中,包括UIButton的点击事件,UITextField的输入事件等等。
首先是ViewController的代码
#import <UIKit/UIKit.h>
@interface Test2ViewController : UIViewController
@end
#import "Test2ViewController.h"
#import "Test2Model.h"
#import "Test2TableViewCell.h"
@interface Test2ViewController ()
@property (nonatomic,weak) IBOutlet UITableView *tableView;
@property (nonatomic,strong) NSArray *data;
@end
@implementation Test2ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"事件传递";
self.tableView.cellDatas = @[self.data];
//设置默认高度
self.tableView.tableViewAdapter.headerHeight = 0.01;
self.tableView.tableViewAdapter.cellHeight = 50;
self.tableView.tableViewAdapter.footerHeight = 0.01;
self.tableView.eventTransmissionBlock = ^id(id target, id params, NSInteger tag, CHGCallBack callBack) {
if ([target isKindOfClass:[Test2TableViewCell class]]) {
NSLog(@"输入内容:%@",params);
}
return nil;
};
}
///构造cell的数据,此处模拟 这些数据可以从网络获取
-(NSArray*)data {
if (!_data) {
_data = @[
[Test2Model initWithPlaceholder:@"请输入用户名" inputText:nil],
[Test2Model initWithPlaceholder:@"请输入密码" inputText:nil],
];
}
return _data;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
Model类Test2Model
#import <Foundation/Foundation.h>
#import "CHGAdapter.h"
@interface Test2Model : NSObject<CHGTableViewCellModelProtocol>
@property (nonatomic,copy) NSString *placeholder;//输入框占位符
@property (nonatomic,copy) NSString *inputText;//输入的内容
+(instancetype)initWithPlaceholder:(NSString*)placeholder inputText:(NSString*)inputText;
@end
#import "Test2Model.h"
@implementation Test2Model
+(instancetype)initWithPlaceholder:(NSString*)placeholder inputText:(NSString*)inputText {
Test2Model * t2 = [Test2Model new];
t2.placeholder = placeholder;
t2.inputText = inputText;
return t2;
}
- (NSString *)cellClassNameInTableView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath {
//如果一个model只对应一个cell 这里可以写死,就不需要外部传入。也可以根据model的某一个字段来判断使用哪一个cell
return @"Test2TableViewCell";
}
- (CGFloat)cellHeighInTableView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath {
return 80;
}
@end
cell类 Test2TableViewCell
#import "CHGTableViewCell.h"
@interface Test2TableViewCell : CHGTableViewCell
@property (nonatomic,weak) IBOutlet UITextField *textField;
@end
#import "Test2TableViewCell.h"
#import "Test2Model.h"
@implementation Test2TableViewCell
- (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
[self.textField addTarget:self action:@selector(textFieldValueChanged:) forControlEvents:UIControlEventEditingChanged];
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
- (void)cellForRowAtIndexPath:(NSIndexPath *)indexPath tableView:(UITableView *)tableView withData:(id)data {
[super cellForRowAtIndexPath:indexPath tableView:tableView withData:data];
Test2Model * model = data;
self.textField.placeholder = model.placeholder;
self.textField.text = model.inputText;
}
-(void)textFieldValueChanged:(id)sender {
//可以将输入内容记录在model中
Test2Model * model = self.cellData;
model.inputText = self.textField.text;
//可以将输入事件传递到ViewController中
self.eventTransmissionBlock(self, self.textField.text, 0, ^id(id data) {
return nil;
});
}
@end
以上就完成了一次最简单的将输入框的输入事件实时的传递到Controller
运行效果
如果需要响应cell点击可以做如下设置
self.tableView.tableViewDidSelectRowBlock = ^(UITableView *tableView, NSIndexPath *indexPath, id itemData) {
//cell点击回调
};
此处演示的是UITextField的输入事件实时传递到ViewController中,你可以根据自己的实际情况返回包括UIButton在内的所有UI控件的事件传递,并且支持Controller中同步和异步返回Cell结果。
GitHub地址:
码云地址: