iOS开发之UITableView及cell重用

1UITanleview有的两种风格

一种是Plain,一种是Grouped,可以从这里设置风格:

他们样式分别如下:

Plain:

Grouped:

2tableView展示数据的过程:

(1)首先,控制器要遵守UITableViewDataSource协议

@interface ViewController () <UITableViewDataSource>

(2)调用数据源的下面方法得知一共有多少组数据

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;

(3)调用数据源的下面方法得知每一组有多少行数据

- (NSInteger)tableView:(UITableView *)

tableView numberOfRowsInSection:(NSInteger)section;

(4)调用数据源的下面方法得知每一行显示什么内容

- (UITableViewCell *)tableView:(UITableView *)

tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

(5)设置分组头部标题

- (NSString *)tableView:(UITableView *)

tableView titleForHeaderInSection:(NSInteger)section;

(6)设置分组尾部标题

- (NSString *)tableView:(UITableView *)

tableView titleForFooterInSection:(NSInteger)section;

(7)滑动删除

/**

*  如果实现了这个方法,就自动实现了滑动删除的功能

*  点击了删除按钮就会调用

*  提交了一个编辑操作就会调用(操作:删除\添加)

*  @param editingStyle 编辑的行为

*  @param indexPath    操作的行号

*/

- (void)tableView:(UITableView *)tableView commitEditingStyle:

(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:

(NSIndexPath *)indexPath

{

if (editingStyle == UITableViewCellEditingStyleDelete) { // 提交的是删除操作,默认就是传的删除

// 1.删除模型数据

[self.contacts removeObjectAtIndex:indexPath.row];

// 2.刷新表格

// 局部刷新某些行(使用前提:模型数据的行数不变)

[self.tableView deleteRowsAtIndexPaths:@[indexPath]

withRowAnimation:UITableViewRowAnimationTop];

// 3.归档

[NSKeyedArchiver archiveRootObject:self.contacts toFile:

MJContactsFilepath];

} else if (editingStyle == UITableViewCellEditingStyleInsert) {

// 1.修改模型数据

MJContact *contact = [[MJContact alloc] init];

contact.name = @"jack";

contact.phone = @"10086";

[self.contacts insertObject:contact atIndex:indexPath.row + 1];

// 2.刷新表格

NSIndexPath *nextPath =

[NSIndexPath indexPathForRow:indexPath.row + 1 inSection:0];

[self.tableView insertRowsAtIndexPaths:@[nextPath] withRowAnimation:UITableViewRowAnimationBottom];

// [self.tableView reloadData];

}

}

例如:

#import "ViewController.h"

@interface ViewController () <UITableViewDataSource>

@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation ViewController

- (void)viewDidLoad

{

[super viewDidLoad];

// 设置数据源

 self.tableView.dataSource = self;

}

#pragma mark - 数据源方法

/**

*  一共有多少组数据

*/

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

return 2;

}

/**

*  第section组有多少行

*/

- (NSInteger)tableView:(UITableView *)

tableView numberOfRowsInSection:(NSInteger)section

{

if (section == 0) {

return 3;

} else {

return 4;

}

}

/**

*  每一行显示怎样的内容(cell)

*/

- (UITableViewCell *)tableView:(UITableView *)

tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

UITableViewCell *cell = [[UITableViewCell alloc]

initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

if (indexPath.section == 0) { // 家禽(第0组)

if (indexPath.row == 0) { // 第0组的第0行

cell.textLabel.text = @"鸡";

} else if (indexPath.row == 1) { // 第0组的第1行

cell.textLabel.text = @"鸭";

} else if (indexPath.row == 2) {

cell.textLabel.text = @"鹅";

}

} else if (indexPath.section == 1) { // 水果(第1组)

if (indexPath.row == 0) { // 第1组的第0行

cell.textLabel.text = @"苹果";

} else if (indexPath.row == 1) { // 第1组的第1行

cell.textLabel.text = @"橘子";

} else if (indexPath.row == 2) {

cell.textLabel.text = @"香蕉";

} else if (indexPath.row == 3) {

cell.textLabel.text = @"西瓜";

}

}

return cell;

}

/**

*  第section组显示怎样的头部标题

*/

- (NSString *)tableView:(UITableView *)

tableView titleForHeaderInSection:(NSInteger)section

{

if (section == 0) {

return @"家禽类";

} else if (section == 1) {

return @"水果类";

}

}

/**

*  第section组显示怎样的尾部标题

*/

- (NSString *)tableView:(UITableView *)

tableView titleForFooterInSection:(NSInteger)section

{

if (section == 0) {

return @"这是家禽类结尾";

} else if(section == 1) {

return @"这是水果类结尾";

}

}

@end

(7)设置行高的两种方法:

方法一:直接调用rowHeight方法

self.tableView.rowHeight = 60;

方法二,使用代理

首先通过连线或者用self.tableView.delegate = self;代码设置代理,然后使ViewController遵守UITableViewDelegate协议。之后调用下列方法直接返回行高即可:

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

(NSIndexPath *)indexPath

{

return 60;

}

3Cell简介

UITableView的每一行都是一个UITableViewCell,通过dataSource的tableView:cellForRowAtIndexPath:方法来初始化每一行。

UITableViewCell内部有个默认的子视图:contentView,contentView是UITableViewCell所显示内容的父视图,可显示一些辅助指示视图。

辅助指示视图的作用是显示一个表示动作的图标,可以通过设置UITableViewCell的accessoryType来显示,默认是UITableViewCellAccessoryNone(不显示辅助指示视图),其他值如下:

还可以通过cell的accessoryView属性来自定义辅助指示视图(比如往右边放一个开关)

4UITableViewCellcontentView

contentView下默认有3个子视图:

其中2个是UILabel(通过UITableViewCell的textLabel和detailTextLabel属性访问)

第3个是UIImageView(通过UITableViewCell的imageView属性访问)

UITableViewCell还有一个UITableViewCellStyle属性,用于决定使用contentView的哪些子视图,以及这些子视图在contentView中的位置

5、给UITableView设置背景

// 设置背景(背景view不用设置尺寸, backgroundView的优先级 > backgroundColor)

UIImageView *bgView = [[UIImageView alloc] init];

bgView.image = [UIImage imageNamed:@"buttondelete"];

cell.backgroundView = bgView;

//点击时的颜色

UIView *selectedbgView = [[UIView alloc] init];

selectedbgView.backgroundColor = [UIColor greenColor];

cell.selectedBackgroundView = selectedbgView;

6、设置UITableView分割线属性

注意apple里RGB值输入的是比例,而且是Float型,比如RGB(255,0,255)应按如下输入:

self.tableView.separatorColor = [UIColor colorWithRed:255/255.0 green:255/255.0 blue:0 alpha:255/255.0];

设置风格,比如无分割线

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

7、在最顶部底部放置控件

表格的头部控件(直接显示表格的最顶部)

self.tableView.tableHeaderView =

[UIButton buttonWithType:UIButtonTypeContactAdd];

self.tableView.tableHeaderView = [[UISwitch alloc] init];//底部放置控件

self.tableView.tableFooterView = [[UISwitch alloc] init];//底部放置控件

8Cell的重用原理

每次有新的一行进入屏幕,都会调用UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]方法,新创建一这个新的行,当往回拖UITableView时,以前的行又会进入屏幕,这时又会再一次创建一个新的这一行并分配新的内存,但最后那些不用的行会最终被销毁,其实最消耗内存的其实是创建和销毁这个过程,创建、销毁速度太快会使内存飙升。

iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存。要解决该问题,需要重用UITableViewCell对象

重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象。

还有一个非常重要的问题:有时候需要自定义UITableViewCell(用一个子类继承UITableViewCell),而且每一行用的不一定是同一种UITableViewCell,所以一个UITableView可能拥有不同类型的UITableViewCell,对象池中也会有很多不同类型的UITableViewCell,那么UITableView在重用UITableViewCell时可能会得到错误类型的UITableViewCell

解决方案:UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象

Cell的重用示例代码:

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

{

// 1.定义一个cell的标识

static NSString *ID = @"mjcell";

// 2.从缓存池中取出cell

UITableViewCell *cell =

[tableView dequeueReusableCellWithIdentifier:ID];

// 3.如果缓存池中没有cell

if (cell == nil) {

cell = [[UITableViewCell alloc]

initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];

}

// 4.设置cell的属性...

return cell;

}

9、为 UITableView添加右侧索引条

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView

{

return [self.groups valueForKeyPath:@"title"];

}

在其中返回一个数组,return [self.groups valueForKeyPath:@"title"];代表从self.groups中取“title”的值赋值给索引名称,点击索引,会根据索引顺序使UITableView跳到对应顺序section。

10、监听UITableView的选中

首先要把ViewController设置为UITableView的代理,并使ViewController遵守UITableViewDelegate协议。主要常用下面两个方法:

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

(NSIndexPath *)indexPath;------选中行时调用

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

(NSIndexPath *)indexPath;------取消选中时候调用

11UITableView数据刷新

全局刷新:

[self.tableView reloadData];

局部刷新:

NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:0];

[self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:

UITableViewRowAnimationBottom];//刷新第0组的第row行

时间: 2024-12-26 00:42:11

iOS开发之UITableView及cell重用的相关文章

iOS开发之UITableView全面解析

在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信.QQ.新浪微博等软件基本上随处都是UITableView.当然它的广泛使用自然离不开它强大的功能,今天这篇文章将针对UITableView重点展开讨论.今天的主要内容包括: 1.基本介绍 2.数据源 3.代理 4.性能优化 5.UITableViewCell 6.常用操作 7.UITableViewController 8.MVC模式   基本介绍 UITableView有两种风

IOS开发之UITableView使用大全。

前言: UITableView是ios开发中最常用的控件之一,几乎所有的应用都要用到,tableview继承UIScrollView,因此它不仅可以显示多行数据,而且具有scrollview的一些操作功能,比如滑动,自动偏移等等,因此非常强大. 而且tableview采用了数据源模式,因此只需要更改它的数据源,即可实现tableview显示数据的变化,而且tableviewcell还具有复用性. 所以tableview是一个在显示大量数据时及其好的选择. 1. tableview采用的是代理模式

iOS开发之UITableView的使用

这一篇记录的是iOS开发中UITableView的使用,iOS中的UITableView跟Android中的ListView特别相似,以下用一个Demo来说明: 1.Xcode中新建projectTestSimpleTableViewproject 2.在Main.storyboard中拖入一个UITableView控件 3.在ViewController.h文件里,实现UITableViewDelegate和UITableViewDataSource协议 这里须要说下的是.为了给UITable

4、iOS 开发之 UITableView

一.UITableView的创建 表格控件在创建时必须指定样式,只能使用以下实例化方法 [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped]; UITableView的两种样式 1> UITableViewStylePlain 2> UITableViewStyleGrouped 2.UITableView的常见属性 // 头部视图(广告) @property (nonatomic,

iOS开发之UITableView使用总结

什么是UITableView 在众多移动应用中,能看到各式各样的表格数据 在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView UITableView继承自UIScrollView,因此支持垂直滚动,而且性能极佳 UITableView的两种样式 UITableViewStylePlain UITableViewStyleGrouped tableView展示数据的过程 1.调用数据源的下面方法得知一共有多少组数据 - (NSInteger)numberOfSections

IOS开发之UITableView的奇技

作者:Biaoac age:保密 sex:直男 性格:低调沉稳,乖张内涵 博客背景:之前一直在使用UITableView,但是一直都只是初识,后来在不断的使用中找到了很多之前没有在意的东西,遂整理出来,当然,有很多还是看别人的博客中提到的点,我把他重踩一遍: 1.点击的时候显示选中状态,但状态一直村在,必须在点击下一个的时候取消选中状态 点击cell的时候调用 - (void)tableView:(UITableView )tableView didSelectRowAtIndexPath:(N

IOS开发之UITableView

UITableView就相当于android中的listview,在这里先介绍一个简单的UItableView的用法,因为我也是刚学.而且也遇到了一些问题.直接上代码吧 这是ViewController.h  #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> @property (nonatomic,retai

iOS开发之UITableView的滚动优化以及隐藏特性的使用

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源码传送:http://dwz.cn/Nret1 影响 UITableView 滚动的流畅性的原因 1. 在代理方法中做了过多的计算占用了 UI

IOS开发之TableView、多个TableViewCell、自定义Cell、Cell上画画(故事板+代码方式)

最近要做一个项目,有个账户设置界面,看了微博.微信.QQ,他们的账号设置都比较原生态没做什么处理.春雨医生的账号不错,做了许多处理.不说废话直接上代码. 第一步: //UserTableViewCell.h这里定义第一种Cell #import <UIKit/UIKit.h> @interface UserTableViewCell : UITableViewCell @property (weak, nonatomic) IBOutlet UIImageView *userviewcelli