乐虎游戏|乐虎国际登录|欢迎你

【BBIN体育平台】UITableView

日期:2020-03-21编辑作者:计算机资讯
  • 首先先看下实现效果

1.tableView

  • tableView如何显示数据

  • 设置dataSource数据源

  • 数据源要遵守UITableViewDataSource协议

  • 数据源要实现协议中的某些方法

  • 必须实现的方法

/**
* 告诉tableView第section组有多少行
*/
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
/**
* 告诉tableView第indexPath行显示怎样的cell
*/
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  • 不必一定实现的方法
/**
* 告诉tableView一共有多少组数据
*/
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
/**
* 告诉tableView第section组的头部标题
*/
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
/**
* 告诉tableView第section组的尾部标题
*/
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section

## tableView性能优化- cell的循环利用方式1

BBIN体育平台 11.gif

2.tableView性能优化 - cell的循环利用方式1

/**
* 什么时候调用:每当有一个cell进入视野范围内就会调用
*/
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 0.重用标识
// 被static修饰的局部变量:只会初始化一次,在整个程序运行过程中,只有一份内存
static NSString *ID = @"cell";

// 1.先根据cell的标识去缓存池中查找可循环利用的cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

// 2.如果cell为nil(缓存池找不到对应的cell)
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
}

// 3.覆盖数据
cell.textLabel.text = [NSString stringWithFormat:@"testdata - %zd", indexPath.row];

return cell;
}

```objc

  • 使用方法

3.tableView性能优化 - cell的循环利用方式2

  • 定义一个全局变量
// 定义重用标识
NSString *ID = @"cell";
  • 注册某个标识对应的cell类型
// 在这个方法中注册cell
- (void)viewDidLoad {
[super viewDidLoad];

// 注册某个标识对应的cell类型
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
}
  • 在数据源方法中返回cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 1.去缓存池中查找cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

// 2.覆盖数据
cell.textLabel.text = [NSString stringWithFormat:@"testdata - %zd", indexPath.row];

return cell;
}

/**

CocoaPods pod 'RATreeView', '~> 2.1.0'

4.tableView性能优化 - cell的循环利用方式3

  • 在storyboard中设置UITableView的Dynamic Prototypes Cell

BBIN体育平台 2

Snip20150602_152.png

  • 设置cell的重用标识

BBIN体育平台 3

Snip20150602_153.png

  • 在代码中利用重用标识获取cell
// 0.重用标识
// 被static修饰的局部变量:只会初始化一次,在整个程序运行过程中,只有一份内存
static NSString *ID = @"cell";

// 1.先根据cell的标识去缓存池中查找可循环利用的cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

// 2.覆盖数据
cell.textLabel.text = [NSString stringWithFormat:@"cell - %zd", indexPath.row];

return cell;

*什么时候调用:每当有一个cell进入视野范围内就会调用

  • 具体使用1.创建model

错误将UIViewController当做UITableViewController来用

BBIN体育平台 4

Snip20150602_110.png

*/

UITableView的常见设置

// 分割线颜色
self.tableView.separatorColor = [UIColor redColor];

// 隐藏分割线
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

// tableView有数据的时候才需要分割线
// 开发小技巧:快速取消分割线
self.tableView.tableFooterView = [[UIView alloc] init];

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

#import <Foundation/Foundation.h>@interface RaTreeModel : NSObject@property (nonatomic,copy) NSString *name;//标题@property (nonatomic,strong) NSArray *children;//子节点数组//初始化一个model- initWithName:(NSString *)name children:(NSArray *)array;//遍历构造器+ dataObjectWithName:(NSString *)name children:(NSArray *)children;@end

#import "RaTreeModel.h"@implementation RaTreeModel- initWithName:(NSString *)name children:(NSArray *)children{ self = [super init]; if  { self.children = children; self.name = name; } return self;}+ dataObjectWithName:(NSString *)name children:(NSArray *)children{ return [[self alloc] initWithName:name children:children];}@end

UITableViewCell的常见设置

// 取消选中的样式(常用) 让当前 cell 按下无反应
cell.selectionStyle = UITableViewCellSelectionStyleNone;

// 设置选中的背景色
UIView *selectedBackgroundView = [[UIView alloc] init];
selectedBackgroundView.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView = selectedBackgroundView;

// 设置默认的背景色
cell.backgroundColor = [UIColor blueColor];

// 设置默认的背景色
UIView *backgroundView = [[UIView alloc] init];
backgroundView.backgroundColor = [UIColor greenColor];
cell.backgroundView = backgroundView;

// backgroundView的优先级 > backgroundColor
// 设置指示器
// cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.accessoryView = [[UISwitch alloc] init];

{

2.创建cell

5.自定义cell

// 0.重用标识

  • 特别注意 xib创建的cell, 一定不要勾选Use Auto Layout,否则cell上的布局不会执行.

5.1 等高的cell

  • storyboard自定义cell
  • 1.创建一个继承自UITableViewCell的子类,比如XMGDealCell

BBIN体育平台 5

Snip20150602_305.png

  • 2.在storyboard中
  • 往cell里面增加需要用到的子控件

BBIN体育平台 6

Snip20150602_302.png

  • 设置cell的重用标识

BBIN体育平台 7

Snip20150602_303.png

  • 设置cell的class为XMGDealCell

BBIN体育平台 8

Snip20150602_304.png

  • 3.在控制器中
  • 利用重用标识找到cell
  • 给cell传递模型数据

BBIN体育平台 9

Snip20150602_301.png

  • 4.在XMGDealCell中
  • 将storyboard中的子控件连线到类扩展中

BBIN体育平台 10

Snip20150602_299.png

  • 需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件上

BBIN体育平台 11

Snip20150602_298.png

BBIN体育平台 12

Snip20150602_300.png

  • xib自定义cell

  • 1.创建一个继承自UITableViewCell的子类,比如XMGDealCell

  • 2.创建一个xib文件(文件名建议跟cell的类名一样),比如XMGDealCell.xib

  • 拖拽一个UITableViewCell出来

  • 修改cell的class为XMGDealCell

  • 设置cell的重用标识

  • 往cell中添加需要用到的子控件

  • 3.在控制器中

  • 利用registerNib...方法注册xib文件

  • 利用重用标识找到cell(如果没有注册xib文件,就需要手动去加载xib文件)

  • 给cell传递模型数据

  • 4.在XMGDealCell中

  • 将xib中的子控件连线到类扩展中

  • 需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件上

  • 也可以将创建获得cell的代码封装起来(比如cellWithTableView:方法)

  • 代码自定义cell(使用frame)

  • 1.创建一个继承自UITableViewCell的子类,比如XMGDealCell

  • 在initWithStyle:reuseIdentifier:方法中

  • 添加子控件

  • 设置子控件的初始化属性(比如文字颜色、字体)

  • 在layoutSubviews方法中设置子控件的frame

  • 需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件

  • 2.在控制器中

  • 利用registerClass...方法注册XMGDealCell类

  • 利用重用标识找到cell(如果没有注册类,就需要手动创建cell)

  • 给cell传递模型数据

  • 也可以将创建获得cell的代码封装起来(比如cellWithTableView:方法)

  • 代码自定义cell(使用autolayout)

  • 1.创建一个继承自UITableViewCell的子类,比如XMGDealCell

  • 在initWithStyle:reuseIdentifier:方法中

  • 添加子控件

  • 添加子控件的约束(建议使用Masonry

  • 设置子控件的初始化属性(比如文字颜色、字体)

  • 需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件

  • 2.在控制器中

  • 利用registerClass...方法注册XMGDealCell类

  • 利用重用标识找到cell(如果没有注册类,就需要手动创建cell)

  • 给cell传递模型数据

  • 也可以将创建获得cell的代码封装起来(比如cellWithTableView:方法)

//被static修饰的局部变量:只会初始化一次,在整个程序运行过程中,只有一份内存

找不到的,请看下图

5.2 非等高的cell

  • xib自定义cell

  • storyboard自定义cell

  • 代码自定义cell(frame)

  • 代码自定义cell(Autolayout)

static NSString *ID = @"cell";

BBIN体育平台 13Snip20160525_1.png

// 1.先根据cell的标识去缓存池中查找可循环利用的cell

cell创建具体如下:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

这是我用xib设置的cell,你们按照你们的需求做

// 2.如果cell为nil(缓存池找不到对应的cell)

BBIN体育平台 14Snip20160525_4.png

if (cell == nil) {

#import <UIKit/UIKit.h>@interface RaTreeViewCell : UITableViewCell@property (weak, nonatomic) IBOutlet UIImageView *iconView;//图标@property (weak, nonatomic) IBOutlet UILabel *titleLable;//标题//赋值- setCellBasicInfoWith:(NSString *)title level:(NSInteger)level children:(NSInteger )children;@end

#import "RaTreeViewCell.h"@interface RaTreeViewCell ()@end@implementation RaTreeViewCell- awakeFromNib { // Initialization code self.selectionStyle = UITableViewCellSelectionStyleNone;}- setSelected:selected animated:animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state}- setCellBasicInfoWith:(NSString *)title level:(NSInteger)level children:(NSInteger )children{ //有自孩子时显示图标 if (children==0) { self.iconView.hidden = YES; } else { //否则不显示 self.iconView.hidden = NO; } self.titleLable.text = title; self.iconView.image = [UIImage imageNamed:@"close"]; //每一层的布局 CGFloat left = 10+level*30; //头像的位置 CGRect iconViewFrame = self.iconView.frame; iconViewFrame.origin.x = left; self.iconView.frame = iconViewFrame; //title的位置 CGRect titleFrame = self.titleLable.frame; titleFrame.origin.x = 40+left; self.titleLable.frame = titleFrame; }

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];

3.创建RATreeView只展示核心代码

}

数据
//加载数据- setData { //宝鸡市  RaTreeModel *zijingcun = [RaTreeModel dataObjectWithName:@"紫荆村" children:nil]; RaTreeModel *chengcunzheng = [RaTreeModel dataObjectWithName:@"陈村镇" children:@[zijingcun]]; RaTreeModel *fengxiang = [RaTreeModel dataObjectWithName:@"凤翔县" children:@[chengcunzheng]]; RaTreeModel *qishan = [RaTreeModel dataObjectWithName:@"岐山县" children:nil]; RaTreeModel *baoji = [RaTreeModel dataObjectWithName:@"宝鸡市" children:@[fengxiang,qishan]]; //西安市 RaTreeModel *yantaqu = [RaTreeModel dataObjectWithName:@"雁塔区" children:nil]; RaTreeModel *xinchengqu = [RaTreeModel dataObjectWithName:@"新城区" children:nil]; RaTreeModel *xian = [RaTreeModel dataObjectWithName:@"西安" children:@[yantaqu,xinchengqu]]; RaTreeModel *shanxi = [RaTreeModel dataObjectWithName:@"陕西" children:@[baoji,xian]]; [self.modelArray addObject:shanxi];}

#######代理方法

#pragma mark -----------delegate //返回行高- treeView:(RATreeView *)treeView heightForRowForItem:item { return 50;}//将要展开- treeView:(RATreeView *)treeView willExpandRowForItem:item { RaTreeViewCell *cell = (RaTreeViewCell *)[treeView cellForItem:item]; cell.iconView.image = [UIImage imageNamed:@"open"]; }//将要收缩- treeView:(RATreeView *)treeView willCollapseRowForItem:item { RaTreeViewCell *cell = (RaTreeViewCell *)[treeView cellForItem:item]; cell.iconView.image = [UIImage imageNamed:@"close"];}//已经展开- treeView:(RATreeView *)treeView didExpandRowForItem:item { NSLog;}//已经收缩- treeView:(RATreeView *)treeView didCollapseRowForItem:item { NSLog;}

####### dataSource方法

//返回cell- (UITableViewCell *)treeView:(RATreeView *)treeView cellForItem:item { //获取cell RaTreeViewCell *cell = [treeView dequeueReusableCellWithIdentifier:@"RaTreeViewCell"]; //当前item RaTreeModel *model = item; //当前层级 NSInteger level = [treeView levelForCellForItem:item]; //赋值 [cell setCellBasicInfoWith:model.name level:level children:model.children.count]; return cell;}/** * 必须实现 * * @param treeView treeView * @param item 节点对应的item * * @return 每一节点对应的个数 */- (NSInteger)treeView:(RATreeView *)treeView numberOfChildrenOfItem:item{ RaTreeModel *model = item; if (item == nil) { return self.modelArray.count; } return model.children.count;}/** *必须实现的dataSource方法 * * @param treeView treeView * @param index 子节点的索引 * @param item 子节点索引对应的item * * @return 返回 节点对应的item */- treeView:(RATreeView *)treeView child:(NSInteger)index ofItem:item { RaTreeModel *model = item; if (item==nil) { return self.modelArray[index]; } return model.children[index];}//cell的点击方法- treeView:(RATreeView *)treeView didSelectRowForItem:item { //获取当前的层 NSInteger level = [treeView levelForCellForItem:item]; //当前点击的model RaTreeModel *model = item; NSLog(@"点击的是第%ld层,name=%@",level,model.name);}//单元格是否可以编辑 默认是YES- treeView:(RATreeView *)treeView canEditRowForItem:item { return YES;}//编辑要实现的方法- treeView:(RATreeView *)treeView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowForItem:item { NSLog(@"编辑了实现的方法");}

4.基本能用到的方法 我都写了注释,如有错误请指出.是不是比官方的清楚的多.

demo地址:

// 3.覆盖数据

cell.textLabel.text = [NSString stringWithFormat:@"testdata - %zd", indexPath.row];

return cell;

}

```

## tableView性能优化- cell的循环利用方式2

-定义一个全局变量

```objc

//定义重用标识

NSString *ID = @"cell";

```

-注册某个标识对应的cell类型

```objc

//在这个方法中注册cell

- (void)viewDidLoad {

[super viewDidLoad];

//注册某个标识对应的cell类型

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];

}

```

-在数据源方法中返回cell

```objc

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

{

// 1.去缓存池中查找cell

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

// 2.覆盖数据

cell.textLabel.text = [NSString stringWithFormat:@"testdata - %zd", indexPath.row];

return cell;

}

```

## tableView性能优化- cell的循环利用方式3

-在storyboard中设置UITableView的Dynamic Prototypes Cell

![](images/Snip20150602_152.png)

-设置cell的重用标识

![](images/Snip20150602_153.png)

-在代码中利用重用标识获取cell

```objc

本文由乐虎游戏发布于计算机资讯,转载请注明出处:【BBIN体育平台】UITableView

关键词:

【LX豪彩】UIProgressView进程条的性格介绍

- viewDidLoad { - (void)viewDidLoad { [super viewDidLoad]; //实例化一个进度条,有两种样式,一种是UIProgressViewStyleBar一种是UIPro...

详细>>

浅谈常见的Loading进度条动效形式

在浏览网页、玩游戏、手提式有线电话机接受等气象,因为网速慢或是硬件差的关联,难免会遇上等候加载的场所,...

详细>>

iOS动漫之自定义转场动漫(push卡塔尔国

push.gif iOS7 开始苹果推出了自定义转场的 API 。从此,任何可以用 CoreAnimation实现的动画,都可以出现在两个 ViewContr...

详细>>

iOS[QuartzCore框架]CADisplayLink篇

在学习CoreAnimation的时候,发现好多地方都用到了CADisplayLink,现在就整理下自己的笔记吧,不足之处敬请指正。===...

详细>>