UITableView最簡單的用法(CHGAdapter)事件傳遞

上一篇文章講到了UITableView使用CHGAdapter框架來簡單的編程(UITableView最簡單的用法(CHGAdapter)),這一節咱們講一下如何優雅的將cell、headerView、footerView中的輸入事件傳遞到Controller中,包括UIButton的點擊事件,UITextField的輸入事件等等。git

首先是ViewController的代碼github

#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類 Test2TableViewCellswift

#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結果。atom

GitHub地址:.net

OC版Swift版code

碼雲地址:

OC版Swift版

相關文章
相關標籤/搜索