转载自汪海的实验室

一 定义dataSource

dataSource.h

[objc] view plain copy
  1. typedef void (^TableViewCellConfigureBlock)(id cell, id item);
  2. @interface GroupNotificationDataSource : NSObject<UITableViewDataSource>
  3. - (id)initWithItems:(NSArray *)anItems cellIdentifier:(NSString *)aCellIdentifier configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock;
  4. - (id)itemAtIndexPath:(NSIndexPath *)indexPath;
  5. @end

dataSource.m

[objc] view plain copy
  1. @implementation GroupNotificationDataSource
  2. {
  3. NSArray     *_itemsArray;
  4. NSString    *_cellIdentifier;
  5. TableViewCellConfigureBlock _configureCellBlock;
  6. }
  7. - (id)init{
  8. return nil;
  9. }
  10. - (id)initWithItems:(NSArray *)anItems cellIdentifier:(NSString *)aCellIdentifier configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock{
  11. self = [super init];
  12. if (self) {
  13. _itemsArray = anItems;
  14. _cellIdentifier = aCellIdentifier;
  15. _configureCellBlock = [aConfigureCellBlock copy];
  16. }
  17. return self;
  18. }
  19. - (id)itemAtIndexPath:(NSIndexPath *)indexPath {
  20. return _itemsArray[(NSUInteger) indexPath.row];
  21. }
  22. #pragma mark tableView DataSource
  23. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  24. return _itemsArray.count;
  25. }
  26. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  27. // NOTE: This method can return nil so you need to account for that in code
  28. GroupNotificationCell *cell=[tableView dequeueReusableCellWithIdentifier:_cellIdentifier];
  29. // NOTE: Add some code like this to create a new cell if there are none to reuse
  30. if (cell==nil) {
  31. cell=[[GroupNotificationCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:_cellIdentifier];
  32. }
  33. id item = [self itemAtIndexPath:indexPath];
  34. _configureCellBlock(cell, item);
  35. return cell;
  36. }

其中,需要注意tableView:cellForRowAtIndexPath:方法中对于cell的重用

二 重写cell的初始化

cell.h

[objc] view plain copy
  1. - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier;

cell.m

[objc] view plain copy
  1. - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
  2. self=[super initWithStyle:style reuseIdentifier:reuseIdentifier];
  3. if (self) {
  4. [self configureUI];
  5. }
  6. return self;
  7. }

三 controller中设置tableview的dataSource

[objc] view plain copy
  1. _dataSource=[[GroupNotificationDataSource alloc]initWithItems:[NSArray arrayWithObjects:@"1",@"2", nil nil] cellIdentifier:CellIdentifier configureCellBlock:^(id cell, id item) {
  2. //
  3. }];
  4. _tableview.dataSource=_dataSource;

需要注意的是_dataSource应该是成员变量,而非局部变量,否则会报错:message send to delloced object

通过分离dataSource 让我们的code具有更高的复用性.相关推荐

  1. [翻译Joel On Software]Joel测试:12步写出更高质量代码/The Joel Test: 12 Steps to Better Code

    Joel on Software The Joel Test: 12 Steps to Better Code Joel测试:12步写出更高质量代码 byJoel Spolsky Wednesday, ...

  2. Java前后端分离动态国际化(动态配置扩展性高)

    介绍 主要是针对前后端分离场景国际化系统设计: 亮点: 1.动态国际化配置 2.可维护性 3.国际化数据池化(性能高) 4.后端数据内容动态国际化 5.提供前台动态国际化数据 6.后台异常国际化处理 ...

  3. 读书笔记-Office 365开发入门指南

    作者博客 Office 365 开发概览系列 - 随笔分类 - 陈希章 - 博客园  https://www.cnblogs.com/chenxizhang/category/967796.html ...

  4. 微信小程序云开发之网易云音乐

    这是跟着慕课网谢成老师敲得代码 注意 知识点 疑惑 思路 妙 优化 一个要注意的地方:如果获取歌词的时候报错(才发现解决办法的图片没传上来 大概就是改变一下请求头数据) 第一章课程介绍 云开发(音乐播 ...

  5. 摘抄Django项目(一)

    果生鲜项目介绍 1.商业模式说明 2.开发流程介绍 3.项目需求分析 4.项目架构分析 5.数据库设计 6.模型类说明 7.创建dailyfresh项目 8.展示注册页面 9.视图函数的get和pos ...

  6. Django 框架 要点

    Python Web 框架要点 1. Web应用程序处理流程 2. Web程序框架的意义 用于搭建Web应用程序 免去不同Web应用相同代码部分的重复编写,只需关心Web应用核心的业务逻辑实现 3. ...

  7. 设计系统简史——过去,现在与可能的未来

    本文共6749个字,预计阅读时间15分钟. 我第一次听说"设计系统"这个概念是在2016年初,契机是在某设计师招聘要求的栏目中看到了"熟悉至少一种设计系统,例如 HIG ...

  8. Java面向对象之全集

    面向对象 什么是面向对象? 面向对象(Object-Oriented,简称OO)是一种编程方法,它将数据和对数据的操作封装在一个对象中,使得程序更易理解.修改和扩展.面向对象思想认为,计算机程序应该被 ...

  9. 从Code Review 谈如何做技术

    本文转载自 www.coolshell.cn (这篇文章缘由我的微博,我想多说一些,有些杂乱,想到哪写到哪) 这两天,在微博上表达了一下Code Review的重要性.因为翻看了阿里内部的Review ...

最新文章

  1. 牵引力人事主管告诉你:如何面试Web前端开发工程师
  2. ocx js php,JS实现OCX控件的事件响应示例_javascript技巧
  3. cms系统与dreamweaver建站
  4. Ado.net连接池 sp_reset_connection 概念
  5. php中时差怎么改,我的PHP时差功能可以改进吗?
  6. 现代软件工程 其实还是人的问题
  7. 网络切片技术缺点_一文读懂网络切片 - 技术综合版块 - 通信人家园 - Powered by C114...
  8. 微信或正测试“发送语音过程”转文字功能 部分安卓用户可用
  9. 线性基的一些基础模版
  10. jQuery基础部分
  11. 为什么不发展三进制计算机,三进制计算机
  12. 接着说tableview的tableheadview
  13. netty源码分析及优点
  14. 绿能宝承载的不单是绿能宝的梦想
  15. xilinx官网下载vivado速度慢的解决方法(适用于所有版本)
  16. Word在方框中插入对勾和×
  17. .c_str()函数解析
  18. php 清除js,php,js清除cookie
  19. 《安富莱嵌入式周报》第298期:迷你火星探测器,开源单片机3D实时渲染库, 开源USB工业相机,VS2022开始支持MarkDown,PC-lint 2.0发布
  20. 985毕业,半路出家28岁进军Java,坚持了三年现如今年薪36W

热门文章

  1. 深入理解Java线程池:ThreadPoolExecutor
  2. dataTable 从服务器获取数据源的两种表现形式
  3. 2014.12.01 B/S之windows8.1下安装IIS
  4. Windows下SVN权限配置过程详解
  5. object expected错误解决方法
  6. 【转】 一些NET的实用类,不错
  7. JavaScript 读写文件
  8. 如何使得按确定和取消按纽转到两个不同的页面!
  9. sizeof 操作符详解
  10. 【FFmpeg】使用sws_scale将AVFrame转换后的图像数据放入cv::Mat中