YBHandyList 1.0.5

YBHandyList 1.0.5

indulgeIn 维护。



  • 杨波

YBHandyList

Cocoapods  Cocoapods  License 

让 UITableView / UICollectionView 更加简单优雅,轻松实现列表动态化、模块化、MVVM 架构。

原理分析文章:iOS 列表界面如何优雅实现模块化与动态化

特性

  • 列表动态化、列表模块化
  • 为实施 MVVM 架构提供支持
  • IOP 思想,轻松接入或弃用,不拖泥带水
  • 无技术难点,轻量化设计,支持原生功能的全部功能

安装

CocoaPods

  1. 在 Podfile 中添加 pod 'YBHandyList'
  2. 执行 pod installpod update
  3. 导入 <YBHandyList/YBHandyList.h>

如果找不到库,可以使用 rm ~/Library/Caches/CocoaPods/search_index.json 来移除本地索引,然后再次执行安装,或者更新一下 CocoaPods 版本。

手动导入

  1. 下载 YBHandyList 文件夹中的全部内容并将其拖入你的项目中。
  2. 导入 YBHandyList.h 文件。

用法

可下载 DEMO 查看示例。

核心思路:UITableView / UICollectionView 的每个 Cell / Header / Footer 都对应一个 Config 对象,Cell / Header / Footer 和其对应的 Config 对象都需要实现相应的协议。

简洁使用

组件默认实现了一系列 Config 对象(如 YBHTableCellConfig / YBHCollectionCellConfig 等),可以直接使用:

YBHTableCellConfig *config0 = [YBHTableCellConfig new];
config0.model = ...;
config0.cellClass = TestTableCell.self;

YBHTableCellConfig *config1 = [YBHTableCellConfig new];
config1.model = ...;
config1.cellClass = TestTableCell.self;

//赋值并刷新
[self.tableView.ybht_rowArray addObjectsFromArray:@[config0, config1]];
[self.tableView reloadData];

同时,Cell / Header / Footer 中需要实现对应的协议:

@implementation TestTableCell
#pragma mark - <YBHTableCellProtocol>
- (void)ybht_setCellConfig:(id<YBHTableCellConfig>)config {
    //根据 config 对象拿到数据做业务处理
    ... = config.ybht_model;
}
+ (CGFloat)ybht_heightForCellWithConfig:(nonnull id<YBHTableCellConfig>)config reuseIdentifier:(nonnull NSString *)reuseIdentifier indexPath:(nonnull NSIndexPath *)indexPath {
    //返回当前 cell 的高度
    return UITableViewAutomaticDimension;
}
@end

当然,你也可以自定义 Config 对象,只需实现相关的协议即可。

Cell / Header / Footer 事件和数据传递

由于 Cell / Header / Footer 被抽象出来了,外表与它们联系的最佳方式是通过 Config 对象(或其属性)。通过 Config 对象(或其属性)持有一个代理对象 Delegate,然后在 Cell / Header / Footer 里面通过 Delegate 向外表传递事件和数据。

笔者建议的方式是自定义 Config 类,只需实现对应的协议(或继承组件默认实现的 Config 类)。

具体实现请参考 Demo。

如何实现更多的 UITableView / UICollectionView 代理方法?

组件所做的是对 UITableView / UICollectionView 的代理方法进行了封装(核心类:YBHandyTableIMP / YBHandyCollectionIMP),然后对外暴露了一个数组来配置,因此难免会有一些未实现的代理方法。

你只需要继承 YBHandyTableIMP / YBHandyCollectionIMP 类,然后在这个子类中实现任何想要的方法,并且可以覆盖父类的实现。然后,将这个子类赋值给 self.tableView.ybht_tableIMP 属性;你甚至可以将 UITableView / UICollectionView 的代理设置为这个 IMP 子类。

UITableView+YBHandyListUICollectionView+YBHandyList只是语法糖而已,组件的核心就是一个代理实现类,非常简单。

如何在 MVVM 架构上实施?

演示中有一个简单的案例。

实际上,在 MVVM 架构中,ViewModel 完全可以视为前面所说的 Config 对象,只要 ViewModel 实现 Config 协议即可,然后每个 Cell / Header / Footer 对应一个 ViewModel。

组件对架构是无感知的,IOP 模式使得它能在大多数场景下无障碍实施。