Latest 0.1.0
Homepage https://github.com/laichanwai/RXTableView
License MIT
Platforms ios 8.0
Dependencies MJRefresh, ReactiveObjC
Authors

RXTableView

RXTableView 是基于 ReactiveCocoa 和 MVVM 的基础上造的一个 tableView 轮子。

抛弃繁杂重复的 TableView 代理实现和 Cell 管理,加入灵活的数据绑定,RXTableView 是一种新的体验。

WorkFlow

在 MVVM 编程中,View 负责显示,Model 负责模型,它们都是相对比较稳定的,一般不会轻易改动代码。
ViewModel 主要是负责业务,一般的数据获取、加工和绑定都是在这里完成。

在使用 RXTableView 中,你只需要完成 4 个步骤:

  1. 定义 Model,并遵循 RXCellModel 协议
  2. 添加自定义 UITableViewCell,并实现 + (CGFloat)cellHeightForCellModel:(id<RXCellModel>)cellModel 方法
  3. 在 ViewModel 中获取数据,并绑定 cellClass
  4. 创建 RXTableView,并绑定相关命令和 ViewModel 的数据源

定义 Model

自定义 Model 并遵循 RXCellModel

RXCellModel 的协议方法已经在分类中实现,自定义 Model 无需自己实现

#import "NSObject+RX.h"

@interface FeedModel : NSObject <RXCellModel>
// ...
@end

添加自定义 UITableViewCell

自定义 UITableViewCell,并参照 RXTableViewCell 的协议方法,按需实现。

RXTableViewCell 的协议方法已在分类中实现

自定义 Cell 需要实现 + (CGFloat)cellHeightForCellModel:(id<RXCellModel>)cellModel 方法返回 Cell 的高度。

  • 自动计算高度
+ (CGFloat)cellHeightForCellModel:(id<RXCellModel>)cellModel {
    return UITableViewAutomaticDimension;
}

// 自动计算高度需要给 estimatedRowHeight 赋一个近似值
tableView.estimatedRowHeight = 100;

绑定 cellClass

// 获取数据
NSArray *models = [NSArray modelArrayWithClass:[FeedModel class] json:data];
for (FeedModel *model in models) {
    // 绑定 CellModel 和 Cell
   model.cellClass = NSClassFromString(@"FeedTableViewCell");
    // 预加载高度
   [model cellHeight];
}

// 更新数据源
self.models = models;

创建 TableView

// 创建 viewModel
self.viewModel = [[FeedViewModel alloc] init];
// 创建 tableView
RXTableView *tableView = [[RXTableView alloc] initWithFrame:self.view.bounds];

// 绑定下拉刷新命令
tableView.refreshCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
    ...
}];
// 绑定上拉加载命令
tableView.loadMoreCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
    ...
}];
// 绑定选中 cell 命令
tableView.didSelectCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(RACTuple *input) {
    ...
}];

// 数据源绑定
RAC(tableView, models) = RACObserve(self.viewModel, models);

// 显示 tableView 并加载数据
[self.view addSubview:tableView];
[tableView.mj_header beginRefreshing];

自定义实现数据源和代理方法

RXTableView 对 dataSourcedelegate 做了中转处理,会优先使用用户自定义的代理,其次才会使用 RXtableView 自身实现的代理方法。

如果你需要自己实现 UITableViewDataSource 或者 UITableViweDelegate,那么你可以把它当做 UITableView 来使用。

@implementation ViewController
// ...
- (void)registerTableView {
    tableView.dataSource = self;
    tableView.delegate = self;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // 点击 Cell 后会忽略 didSelectCommand,进入该方法
}
// ...
@end

项目依赖

Latest podspec

{
    "name": "RXTableViewObjc",
    "version": "0.1.0",
    "summary": "Reactive TableView",
    "description": "RXTableView u662fu57fau4e8e ReactiveCocoa u548c MVVM u7684u57fau7840u4e0au9020u7684u4e00u4e2a tableView u8f6eu5b50u3002nu629bu5f03u7e41u6742u91cdu590du7684 TableView u4ee3u7406u5b9eu73b0u548c Cell u7ba1u7406uff0cu52a0u5165u7075u6d3bu7684u6570u636eu7ed1u5b9auff0c`RXTableView` u662fu4e00u79cdu65b0u7684u4f53u9a8cu3002",
    "homepage": "https://github.com/laichanwai/RXTableView",
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    },
    "authors": {
        "laizw": "[email protected]"
    },
    "source": {
        "git": "https://github.com/laichanwai/RXTableView.git",
        "tag": "0.1.0"
    },
    "platforms": {
        "ios": "8.0"
    },
    "source_files": "RXTableView/**/*.{h,m}",
    "dependencies": {
        "MJRefresh": [
            "3.1.12"
        ],
        "ReactiveObjC": [
            "3.0.0"
        ]
    }
}

Pin It on Pinterest

Share This