IOS开发中UITableView(表视图)的滚动优化及自定义Cell
IOS开发中UITableView(表视图)的滚动优化及自定义Cell
IOS 开发中UITableView是非常常用的一个控件,我们平时在手机上看到的联系人列表,微信好友列表等都是通过UITableView实现的。UITableView这个控件中的列表的每一行是一个cell,当UITableView中cell数量特别大的时候,由于每次都需要alloc分配内存并初始化,会导致app运行不流畅,所以可以使用苹果提供的几个方法进行优化,我把这个过程记录下来供自己以后查阅。
当然,既然说到优化,那我们就从没有优化的状态开始谈起。先使用最基本的流程实现一个UITableView(表视图),然后再谈优化,以及自定义。
本文正文主要分一下三步:
一、使用最基本的流程来实现一个表视图:
文章一开始说了UITableView这个控件中的列表的每一行是一个cell,所以我们先创建一个UITableView表视图,然后在datasource代理方法中返回cell的个数,以及创建cell:
1、创建UITableView控件myTableView,全局变量、设置代理、添加到当前view:
#import "ViewController.h"
@interface ViewController (){
UITableView *myTableView;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
myTableView = [[UITableView alloc]initWithFrame:CGRectMake(, , , )];
myTableView.backgroundColor = [UIColor lightGrayColor];
myTableView.delegate = self;
myTableView.dataSource = self;
[self.view addSubview:myTableView];
}
2、在头文件中添加代理:
//
// ViewController.h
// UITableView列表
//
// Created by mac on 16/4/15.
// Copyright © 2016年 mzw. All rights reserved.
// #import <UIKit/UIKit.h> //添加代理UITableViewDataSource和UITableViewDelegate
@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> @end
3、进入UITableViewDataSource中找到代理方法并粘贴到.m文件中,实现方法,其中:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 返回一个数字,是cell的个数;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 返回的是UITableViewCell,所以我们就在这个函数中创建cell,并返回,这样就实现了代理方法。
具体代码:
//myTableView的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return ;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// 创建UITableViewCell
UITableViewCell *cell = [[UITableViewCell alloc]init];
// UITableViewCell自带textlabel,indexPath.row为行数
cell.textLabel.text = [NSString stringWithFormat:@"这是第%ld行",indexPath.row];
return cell;
}
以上代码的第9行创建了UITableViewCell并初始化,第11行是给cell自带的textlabel设置文字的,这样的做法就是:需要多少个cell,就alloc多少次,如果软件需要的cell个数太多,会导致下拉时非常卡。但是在需要展示的数据量很小,也就是需要的cell不多的时候,可以使用这种方式。
通过这种方式实现的表视图模拟如下:

二、通过优化表视图中cell的创建使之节约内存。
滚动优化的原理就是如果这个屏幕上能显示10个cell,那我就创建11个cell,不管有多少数据要现实,就用这11个cell。当用户上拉或下拉的时候,上面消失的cell将重新装入要显示的数据,然后显示在屏幕上,相当于总有一个在缓冲等待显示。通过这样的方式减少了cell的alloc次数,进而降低了内存开销,提高了系统性能。
要实现以上思路,只需要把一中的创建cell的代码换成一下语句:
// // 2、使用队列池优化方式创建cell
static NSString *cellid = @"cell";//一个固定的标识
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellid];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellid];
}
三、自定义表视图中cell样式:
1、先新建一个继承自UITableViewCell的类,我这里创建的名称是myTableViewCell,创建的时候勾选创建nib文件。
2、打开创建好的nib文件,然后里面已经有一个cell了,我们采用拖拽的办法给这个cell里加入一个UIImageView,然后给里面放置一个图片,在这里我使用一张黄色的纯色图片,然后在cell的左边拖入一个buttom,右边拖入一个label,完成后如下图:

3、在 myTableViewCell.h中定义两条语句
@property(nonatmic, strong)IBOUTLET UIButton *mybutton;
@property(nonatmic, strong)IBOUTLET UILabel *mylabel;
写完这两句之后就可以在nib中拖线连接关系了,这个过程是最基本的,这里不说。
4、在ViewController.m中完成app 的主要功能,也就是表视图的实现:
//
// ViewController.m
// UITableView使用nib拖动自定义
//
// Created by mac on 16/4/15.
// Copyright © 2016年 mzw. All rights reserved.
// #import "ViewController.h"
#import "myTableViewCell.h" @interface ViewController (){
UITableView *myTableView;
NSArray *contentArray;
} @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; myTableView = [[UITableView alloc]initWithFrame:CGRectMake(, , , )]; myTableView.delegate = self;
myTableView.dataSource = self;
[self.view addSubview:myTableView]; // 用来为cell的mulabel赋值的数组
contentArray = @[@"one",@"two",@"three",@"four",@"five",@"six",@"seven",@"eight",@"nine",@"ten",]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
// 设置cell的数量为数组的元素个数
return contentArray.count;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ // 优化方式创建cell
static NSString *cellid = @"cell";
myTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellid]; if (cell == nil) { // 使用绘制好的nib为cell赋值
cell = (myTableViewCell*)[[[NSBundle mainBundle]loadNibNamed:@"myTableViewCell" owner:self options:nil] objectAtIndex:]; // cell上按钮的button,为了从cell上的多个控件中区分出某个button
cell.mybutton.tag = ; // 为cell上的button添加方法
[cell.mybutton addTarget:self action:@selector(haha:) forControlEvents:UIControlEventTouchUpInside]; // 使用数组的内容为cell赋值
cell.mylabel.text = [contentArray objectAtIndex:[indexPath row]];
} return cell; } //拿到cell,然后根据tag拿到button然后输出buttn上的文字
-(void)haha:(UIButton*)sender{
// button在cell的content上,所以通过以下方法获取
myTableViewCell *cell =(myTableViewCell*)[[sender superview]superview];
UIButton *mybutton = (UIButton*)[cell viewWithTag:];
NSLog(@"%@",mybutton.titleLabel.text);
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end
模拟效果如下:

以上。
IOS开发中UITableView(表视图)的滚动优化及自定义Cell的更多相关文章
- iOS开发之多表视图滑动切换示例(仿"头条"客户端)---优化篇
前几天发布了一篇iOS开发之多表视图滑动切换示例(仿"头条"客户端)的博客,之所以写这篇博客,是因为一位iOS初学者提了一个问题,简单的写了个demo做了个示范,让其在基础上做扩展 ...
- iOS开发系列--UITableView全面解析
--UIKit之UITableView 概述 在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信.QQ.新浪微博等软件基本上随处都是U ...
- iOS开发中获取视图在屏幕上显示的位置
在iOS开发中,我们会经常遇到一个问题,例如,点击一个按钮,弹出一个遮罩层,上面显示一个弹框,弹框显示的位置在按钮附近.如果这个按钮的位置相对于屏幕边缘的距离是固定的,那就容易了,可以直接写死位置.可 ...
- iOS企业级开发初级课程-表视图(13集)
首先了解了表视图的组成.表视图类的构成.表视图的分类以及表视图的两个重要协议(委托协议和数据源协议),对表视图有了一个整体上的认识.接下来我们掌握了如何实现简单表视图和分节表视图,以及表视图中索引.搜 ...
- iOS开发中视图控制器ViewControllers之间的数据传递
iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storybo ...
- UI学习笔记---第九天UITableView表视图
UITableView表视图 一.表视图的使用场景 表视图UITableView是iOS中最重要的视图,随处可见,通常用来管理一组具有相同数据结构的数据 表视图继承自UIScrollView,所以可以 ...
- UITableView表视图以及重建机制
表视图UITableView 表视图UITableView,是IOS中最重要的视图,随处可见 表视图通常用来管理一组具有相同数据结构的数据 UITableView继承自UIScrollView,所 ...
- UI:UITableView表视图
表视图 UITableView,iOS中最重要的视图,随处可⻅见. 表视图通常⽤用来管理⼀一组具有相同数据结构的数据. UITableView继承⾃自UIScrollView,所以可以滚动,表视图的每 ...
- iOS开发中遇到的一些问题及解决方案【转载】
iOS开发中遇到的一些问题及解决方案[转载] 2015-12-29 [385][scrollView不接受点击事件,是因为事件传递失败] // // MyScrollView.m // Creat ...
随机推荐
- HDU 3861 The King’s Problem(tarjan连通图与二分图最小路径覆盖)
题意:给我们一个图,问我们最少能把这个图分成几部分,使得每部分内的任意两点都能至少保证单向连通. 思路:使用tarjan算法求强连通分量然后进行缩点,形成一个新图,易知新图中的每个点内部的内部点都能保 ...
- struts2+ajax实现异步验证
由于老师布置作业的需要,在添加管理员的时候,要实现验证添加的管理员的用户名是否在数据库中已经存在,然后再客户端给用户一个提示.我首先想到的就是利用ajax实现异步验证技术,由于利用的ssh框架,所以在 ...
- Java项目开发第二天
相对来说今天还是轻松了挺多的,好了,刚刚跑完步,今天心情不错,直接进入主题,就不废话了. (PS:室友都去准备迎新了,老大也是,还好都将课本留给我了,可以好好的看看书了,好好学习,天天向上.) 图形用 ...
- Mysql命令-以NULL做where条件过滤时应该写 IS NULL;
以NULL做where条件过滤时应该写 IS NULL;SELECT * FROM pet WHERE death IS NULL; SELECT * FROM pet WHERE death IS ...
- C#编写Windows服务程序图文教程
安装服务程序C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe 要安装的服务程序路径(如F:\***.exe)卸载服务程序C: ...
- 鉴客 C# 抓取页面(带认证)
1. [代码][C#]代码 01 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(""); 02 re ...
- TCP/IP网络协议栈(转载)
原文:http://www.cnblogs.com/xuanku/p/tcpip.html TCP/IP网络协议栈分为四层, 从下至上依次是: 链路层 其实在链路层下面还有物理层, 指的是电信号的传输 ...
- android脚步---自动完成文本框
自动完成文本框AutoCompleteTextView,当用户输入一定字符时,自动完成文本框会显示一个下拉菜单,供用户选择,设置一个Adapter,该Adapter中封装了AutoCompleteTe ...
- 生成makefile文件编译源文件
1.利用CodeBlock的cbp文件生成makefile文件 reverse@ubuntu:~/Desktop/CreateMakeFile$ ls cbp2make.linux-x86 freeg ...
- (转)Java 之 FileReader FileInputStream InputStreamReader BufferedReader 作用与区别
Java 之 FileReader FileInputStream InputStreamReader BufferedReader 作用与区别 ava.io下面有两个抽象类:InputStream和 ...