美文网首页
UITableView封装(代码块回调,cell解耦)

UITableView封装(代码块回调,cell解耦)

作者: CYberseERker | 来源:发表于2017-03-29 21:18 被阅读0次

前言

一直以来我都不太习惯于UITableView的使用方式,因为只要是用tableview的控制器在调试代码的时候难免会来回翻看代码(代码不集中),而且有时候还要引入茫茫多的cell,并且还需要在代理方法中配置cell或者是在viewmodel里面配置cell。由于无法忍受这些不便,我决定另辟蹊径。

实现

这开始要做什么呢?既然是封装,那就先新建一个类来继承UITableView。然后我想让有关tableview相关代码集中,那么可以使用代码块来解决这个问题,在tableview初始化的时候代理就要指向自己,然后在代理方法中调用外界赋值的代码块来回调。
举个例子:

- (void)setCellResponseBlock:(SCTableViewCellResponseBlock)cellResponseBlock {
    _cellResponseBlock = cellResponseBlock;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (_needDeselect) {
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
    if (_cellResponseBlock) {
        _cellResponseBlock(_myDataSource[indexPath.section][indexPath.row], indexPath);
    }
}

上面的问题告一段落。cell的注册怎么办呢?不引入文件就可以注册,这里我们需要感谢一下OC的runtime机制。
上代码:

Class cellClass = NSClassFromString(cellClassName);
if ([[NSBundle mainBundle] pathForResource:cellClassName ofType:@"nib"]) {
   [self registerNib:[UINib nibWithNibName:cellClassName bundle:[NSBundle mainBundle]] forCellReuseIdentifier:cellClassName];
}
else {
  [self registerClass:cellClass forCellReuseIdentifier:cellClassName];
}

问题处理到这儿,就剩下数据处理的问题了。这里我们还是用代码块回调吗?但是这么做不还是让控制器来解决cell的配置呀。或者说在这个封装的tableview中引入这些cell?那我把这个tableview抽出来用还要解决那一大堆cell的引入问题。这个时候category站出来了,我们需要在category里面编写一个协议来声明处理数据的接口,然后我们再将这个category引入到tableview中,创建的cell也要引入category并且实现协议。
category是酱紫的:

@protocol SCBaseTableCellInterFace <NSObject>
@required
//处理数据方法
- (void)dealWithData:(NSDictionary *)dict;
@optional
//返回cell高度方法。如果返回高度小于等于0或者不实现此方法,tableview将会按照自动布局方法计算行高。
- (CGFloat)getSubCellHeight;
@end
@interface UITableViewCell (BaseConfiguration)
@end

好了,设计的思路大概就是这样。不过这个封装也还存在很多不完善的地方,此文可供参考。代码传送门在这里

相关文章

  • UITableView封装(代码块回调,cell解耦)

    前言 一直以来我都不太习惯于UITableView的使用方式,因为只要是用tableview的控制器在调试代码的时...

  • UITableView 解耦

    产品开发的时候无法避免的就是在一个 UITableView中, 包含多种样式的 cell, 我们通常的做法如下: ...

  • 1、MVC模式和MVT模式

    解耦 1.解耦:不同的代码块之间降低耦合2.向后兼容:代码更新迭代3.增强代码的可扩展性和可移植性,以提高向后兼容...

  • Python的函数定义

    有经验的程序员往往将功能较为独立、且可以被重复使用的代码块封装成函数,可以有效提高代码的模块化、解耦性和重复利用率...

  • IOS - 判断UITableView首次加载完成

    在sdk中,的确没有UITableView首次加载完成Cell的回调方法。在代理的方法中,也是没有的。不过我们可以...

  • 类的设计

    消除代码重复的两个方法:函数和继承。 类设计的评判标准:耦合、聚合。 封装可以解耦。

  • 解耦

    解耦 对于大型重构, 最有效的手段就是 解耦, 解耦的目的使实现代码高聚合、松耦合。 解耦为何如此...

  • block 的使用 (一)

    iOS 三大回调方式:目标动作回调,委托回调,代码块回调,喜欢 block 是因为他很简洁紧凑,代码可读性高。 b...

  • 2022-05-01代码重构 -- 大小规模重构

    大规模高层次重构 解耦代码 “解耦”为何如此重要? 过于复杂的代码往往在可读性、可维护性上都不友好。解耦保证代码松...

  • 封装、继承、多态

    封装:隐藏实现细节通过公共方法向外暴露该对象的功能作用:解耦 封装:解耦隐藏对象的实现细节通过公共方法来向外暴露该...

网友评论

      本文标题:UITableView封装(代码块回调,cell解耦)

      本文链接:https://www.haomeiwen.com/subject/xpryottx.html