一、UITableView的代理方法

#pragma mark 每一行的高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

#pragma mark 选中了某一行就会调用

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

#pragma mark 取消选中了某一行就会调用

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

#pragma mark 当用户提交了一个编辑操作就会调用(比如点击了“删除”按钮)

// 只要实现了这个方法,就会默认添加滑动删除功能

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

#pragma mark 当移动了某一行cell就会调用

// 只要实现了这个方法,就会默认添加排序功能

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath

二、修改Cell的状态

1.最好通过“修改模型数据”来修改Cell的状态

2.修改步骤

1> 修改模型数据

2> 刷新表格

* 整体刷新:reloadData(最重要)

* 局部刷新:reloadRowsAtIndexPaths:withRowAnimation:

三、UITableView常见方法

1.取消选中某一行(去掉cell选中时默认的蓝色背景)

- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated;

2.局部刷新(仅仅刷新indexPaths数组中装着的行)

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

3.整体刷新(屏幕中的每一行都刷新)

- (void)reloadData;

4.直接删除界面上的行数(要求模型数据也要删掉对应的数量)

- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

5.设置编辑模式

@property(nonatomic,getter=isEditing) BOOL editing;

- (void)setEditing:(BOOL)editing animated:(BOOL)animated;

// 注意:

不管是局部刷新,还是整体刷新,原理都是:

UITableView重新向数据源(dataSource)和代理(delegate)发送相应的消息,最终将得到的数据展示出来

1.常见错误解析

1.1

错误原因:说ViewController 没有实现 tableView:numberOfRowsInSection:

解决方式:实现tableView:numberOfRowsInSection:

1.2

UITableView内部实现原理:

数据源实现了这个方法

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

tableView内部自动会调用以下方法添加cell。

[tableView addSubview:cell];

如果返回的cell为空,也就意味着生成下面一行代码。

[tableView addSubview:nil];

而addSubview是将右边参数添加到数组中保存起来,而数组是不能添加空值的。所有集合对象都不能出传空。例如数组,字典,NSSet。

以上错误总结:作为tableView的数据源必须实现两个方法。

返回行数

-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section;

返回每一行显示的内容

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

另外返回每一行显示的内容不能返回nil。

2.淘宝界面例子思路

UITableView开发模式都是先将数据转换为模型。

步骤一:根据plist文件创建模型对象

步骤二,解析plist文件,将文件中的数据转换为模型对象。

步骤三:将模型对象用一个数组保存起来

步骤四:实现tableView的数据源方法。(设置数据源,遵守数据源协议)

步骤五:将字典转化为模型的操作封装到模型里面去。

步骤六:根据设计角度的上面思考,需要实现两个方法。

步骤七:实现tableView的代理方法。(设置代理,遵守代理协议)

步骤八:点击某一行打钩实现步骤:

  1. 用一个数组记录住选中的模型(如果模型在数组中了就删除,没有就添加)
  2. 刷新表格

步骤九:在返回每一行的方法中,添加一个判断来决定是否cell需要打钩

步骤十:更改UILabel的显示

步骤十一:监听删除按钮的点击

  1. 删除模型
  2. 刷新表格
  3. 更改标题
  4. 清空被选中模型的数组
  5. 让删除按钮不能点击

3.事件处理补充:UILable不能处理事件。因此把UILabel放在按钮上面也能点击,他会把事件传递给下一个控件处理。

4.刷新表格行的方法.

使用注意:必须前后数据保持一致才能调用这些方法,否则会报错。

-(void)reloadRowsAtIndexPaths:(NSArray*)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

-(void)reloadSections:(NSIndexSet*)sections withRowAnimation:(UITableViewRowAnimation)animation;

使用注意:必须数据删除多少,表格删除多少,前后数据不一致才能调用这些方法,否则会报错。

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;

- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;

这个刷新方法,没有限制

- (void)reloadData;

5.UITableView编辑模式删除功能小例子思路

步骤一:搭建页面

步骤二:实现数据源方法。(设置数据源,遵守数据源协议)

步骤三:创建数据模型

步骤四:创建数组保存数据模型

步骤五:监听删除按钮,点击删除按钮进入编辑模式

步骤六:改本地化

步骤七:实现代理方法。

当用户提交一个编辑操作就会调用。实现这个方法还会默认支持滑动删除

  1. 删除模型数据
  2. 刷新表格

步骤八:实现排序功能

  1. 调整模型数据里的顺序
  2. 取出要拖动的模型数据
  3. 先删除要拖动的模型数据
  4. 然后将拖动的模型数据插入新的位置

6.UITableViewCell的结构:UITableViewCell外面有一层ContentView,以后要往UITableViewCell里添加子控件,添加到ContentView上面。

7.MVC

模型中不能拥有控制器和视图,模型有可能用来重用的,包含控制器就不能重用了,因为模型脱离控制器就不能使用了。

视图不能直接访问模型。

视图和模型的联系都是通过控制器。

控制器向模型拿到数据展示到视图上。

iOS基础 - UITableView的数据源和代理的更多相关文章

  1. iOS基础 - UITableView的数据源(dataSource)和代理(delegate)

    UITableView的数据源(dataSource)和代理(delegate) UITableView需要一个数据源(dataSource)来显示数据,UITableView会向数据源查询一共有多少 ...

  2. [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)

    A.概述      在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能      1.按钮点击后,显示为“已下载”,并且不 ...

  3. iOS基础 - 瀑布流

    一.瀑布流简介 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pint ...

  4. iOS基础 - UITableViewController

    1. 继承UITableViewController默认会设置数据源和代理,并且会自动遵守数据源和代理协议,并且self.tableView 相当于 self.view 2.更换控制器时,注意把sto ...

  5. iOS中UITableView的一些问题思考

    UITableview的数据源为什么是代理,而不是引用? 我的理解,一般情况下控制器会引用tableView, 数据源和代理方法都是tableView的一个若引用,出了“tableView.datas ...

  6. iOS基础 - UIDatePicker and UIPickerView and UITextField

    1.UIDatePicker继承自UIControl,因此不会通过代理来监听事件的改变,而是通过addTarget来监听事件.监听的事件是值改变事件. 2.UIPickerView继承自UIView, ...

  7. ios基础篇(二十八)—— UITableView的上拉加载

    本文主要展示一个demo实现UITableView的上拉加载数据: 先看看效果图: 接着上拉,加载更多数据: 主要实现的效果是在我们上拉结束拖拽之后,开始加载数据,数据加载的过程中有滚动轮提示用户正在 ...

  8. IOS第七天(2:UiTableView 加上数据分离)

    ****加上数据分离 #import "HMViewController.h" #import "HMStudent.h" @interface HMViewC ...

  9. [iOS基础控件 - 6.0] UITableView

    A.需要掌握的 1.基本属性和方法 设置UITableView的dataSource.delegate UITableView多组数据和单组数据的展示 UITableViewCell的常见属性 UIT ...

随机推荐

  1. STUN协议简介

    STUN简要 STUN(Simple Traversal of UDP over NATs,NAT 的UDP简单穿越)是一种网络协议.它同意位于NAT(或多重NAT)后的client找出自己的公网地址 ...

  2. 采用 HTML5 File API 达到client log

    http://www.ibm.com/developerworks/cn/web/1210_jiangjj_html5log/ 版权声明:本文博主原创文章,博客,未经同意不得转载.

  3. Android入门——电话拨号器和4种点击事件

    关于HelloWorld为,电话拨号程序还AndroidA入门demo,从这个样例我们要理清楚做安卓项目的思路. 大体分为三步: 1.理解需求,理清思路 2.设计UI 3.代码实现 电话拨号器 1.  ...

  4. 【转】Java 工程师成神之路

    一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133 http://i ...

  5. 从头开始学JavaScript (十三)——Date类型

    说明:UTC:国际协调日期 GMT:格林尼治标准时间 一.date类型的创建 使用new操作符和Date()构造函数 var now=new Date(): 传入参数:Date.parse()和Dat ...

  6. Postman 是一个非常棒的Chrome扩展,提供功能强大的API & HTTP 请求调试

    Postman 是一个非常棒的Chrome扩展,提供功能强大的API & HTTP 请求调试   需要FQ才能安装,使用时应该不用FQ了,除非使用postman的历史记录功能:   非常棒的C ...

  7. javascript中类的属性研究

    原文:javascript中类的属性研究 本篇文章主要针对javascript的属性进行分析,由于javascript是一种基于对象的语言,本身没有类的概念,所以对于javascript的类的定义有很 ...

  8. Android实现“是否退出”对话框和“带图标的列表”对话框

    今天我们学习的内容是实现两种对话框(Dialog),第一种是询问是否退出对话框,另外一种是带图标的列表对话框,程序的执行效果是,我们点击button1的时候,弹出第一种对话框,我们点击button2的 ...

  9. Content-Type boundary 问题

    我并不知道问题怎么描述清楚一些. 事情是这样的,使用  Microsoft Dynamics CRM Server 2016 做CRM系统的时候用到 使用 Web API 执行批处理操作(参见SDK或 ...

  10. MVC验证02-自定义验证规则、邮件验证

    原文:MVC验证02-自定义验证规则.邮件验证 本文体验MVC自定义验证特性,来实现对邮件的验证.对于刚写完的自定义验证特性,起初只能支持后端验证.如果要让前端jquery支持,还必须对jquery的 ...