UITableViewCell的复用

2024-06-03 06:08
文章标签 复用 uitableviewcell

本文主要是介绍UITableViewCell的复用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UITableView的动态模式在开发中是很重要的,能够通过对Cell的复用快速的开发一个UITableView.这里对UITableView的动态创建进行一些总结 :

这里写图片描述

创建一个TableViewController以后,观察TableView的属性,在Content中选择Dynamic Prototypes。在下面可以选择几种Prototype Cells

这里写图片描述

接下来选中一个Cell,在右边我们可以选择这种原型Cell的Style。接下来最关键的部分是Identifier,身份信息,这个有关于后面我们进行复用的时候需要的信息。

接下来是通过对TableView设置数据源

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{return 1;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{switch (section) {case 0:return 4;break;default:return 0;break;}}

这里建立了一个section,section里面有四行

下面是最关键的复用部分。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{static NSString *cellIdentifierForImage=@"UITableViewCellIdentifierKeyWithView";
//    static NSString *cellIdentifierForDetail=@"UITableViewCellIdentifierKeyWithDetail";UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellIdentifierForImage];switch (indexPath.row) {case 0:{cell.textLabel.text = @"头像";cell.accessoryView = self.avatar;return cell;}case 1:{cell.textLabel.text = @"用户名";cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;cell.detailTextLabel.text= self.nameLabel.text;[cell.detailTextLabel sizeToFit];return cell;}case 2:{cell.textLabel.text = @"修改密码";cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;return cell;}break;default:return cell;break;}return cell;
}

在下面的代码中

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellIdentifierForImage];

我们服用了identifier为cellIdentifierForImage的类型的cell。那么在运行的时候,将会复用cellIdentifierForImage的cell创建三个。

对于cell的复用,sdk中提供了两种不同的方法

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier;  
- // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); 
- // newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered

上面是是官方文档中对两种方法的解释。

可以看到第二种注释的是在IOS6后可以使用。

那么区别在于什么呢?

一种解释是:

第一种是使用在ARC模式下的,不需要设置全局static,直接使用重用池。

第二种是使用在MRC模式下的,需要设置重用池。

在我实验过后发现

第一种方法在找不到identifier的时候会报错,因为该方法必须找到一个已经alloc的对象。第二种方法如果找不到的时候会返回一个默认的cell。总的来说第二种方法能避免出错。

这篇关于UITableViewCell的复用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026186

相关文章

《设计模式:可复用面向对象软件的基础》读书笔记(3)

这篇博客记录了书中《第3章:创建型模式》里的要点。 介绍 创建型设计模式抽象了实例化过程。 在这些模式中有两个不断出现的主旋律: 他们都将关于该系统使用哪些具体的类的信息封装起来。他们隐藏了这些类的实例是如何被创建和放在一起的。 整个系统关于这些对象所知道的是由抽象类所定义的接口。因此,创建型模式在什么被创建、谁创建它、它是怎样被创建的,以及何时被创建等方面给予你很大的灵活性。 下面将这

【设计模式】哪些模式可以提高代码的可维护性和复用性?

可维护性 MVC模式 (Model-View-Controller):将应用程序分为三个部分,分别是模型(Model)、视图(View)和控制器(Controller),它们之间通过定义清晰的接口进行交互。这种模式可以将业务逻辑与用户界面分离,使得应用程序更容易维护和优化。 观察者模式 (Observer):将对象之间的一对多的依赖关系封装起来,当一个对象发生改变时,它的所有依赖者都会得到通

OkHttp3源码分析[复用连接池]

OkHttp系列文章如下 OkHttp3源码分析[综述]OkHttp3源码分析[复用连接池]OkHttp3源码分析[缓存策略]OkHttp3源码分析[DiskLruCache]OkHttp3源码分析[任务队列] 1. 概述 HTTP中的keepalive连接在网络性能优化中,对于延迟降低与速度提升的有非常重要的作用。 通常我们进行http连接时,首先进行tcp握手,然后传输数据,最后释

创建UITableViewCell(不使用XIB情况)

一、直接使用系统提供的cell//1. 从复用池(复用队列)中根据复用标识取一个cellUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: @"cell];//2. 如果取不到,则创建一个cell并指定一个复用标识。if (cell == nil){cell = [[UITableViewCell alloc]

如何得到自定义UITableViewCell中的按钮所在的cell的indexPath.row

在创建button的时候可以把indexpath的值给button.tag。点击的时候响应sender.tag. 在自定义UITableViewCell中创建了一个按钮。 想在点击该按钮时知道该按钮所在的cell在TableView中的行数。就是cell的 indexPath.row 两种方法都很好。 -(IBAction):(id)sender {

做好代码复用不简单(1)

前面我们用了那么多示例讨论了代码复用。毫无疑问,几乎所有人都明白代码复用的重要意义,知道要写好代码必须要合理地复用代码。然而,曾经有一份真挚的感情放在你面前你却没有珍惜,那就是你应该复用代码了。等你失去的时候我才后悔莫及,有木有?为什么每当我们应当复用代码的关键时刻,我们却往往选择复制粘贴呢?因为道理非常清楚但实际操作起来却困难重重,因为要实现复用必须要调整原有程序。要调整原有程序,这就不好玩了

IO端口复用之poll的底层实现

介绍     解说中存在一些函数和数据结构,具体出处可以参照上一篇关于select的分析 《IO端口复用之select的底层实现》,里面提及了一些储备知识点,本篇不再赘述。     由于tcp过于复杂,取个巧,全篇以udp连接来说明一下,内核版本依旧对应2.6.32。 poll系统调用做了什么 接口说明     poll系统调用接口,一共需要3个参数。     第一个参数是监听集指针u

IO端口复用之select的底层实现

介绍     由于tcp过于复杂,取个巧,全篇以udp连接来说明一下,内核版本对应2.6.32。     select说到底是和网络套接字打交到的,从网络套接字创建的过程(socket和bind系统调用),来了解一下socket、sock、inet_sock等数据结构之间的联系,以及创建一个监听套接字之后到底发生了哪些变化。 储备知识点     此处是一些琐碎的知识点,以便更好的理解sel

深入理解JavaScript系列(46):代码复用模式(推荐篇)

介绍 本文介绍的四种代码复用模式都是最佳实践,推荐大家在编程的过程中使用。 模式1:原型继承 原型继承是让父对象作为子对象的原型,从而达到继承的目的: function object(o) {function F() {}F.prototype = o;return new F();}// 要继承的父对象var parent = {name: "Papa"};// 新对象

深入理解JavaScript系列(45):代码复用模式(避免篇)

介绍 任何编程都提出代码复用,否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量避免使用这些模式,因为或多或少有带来一些问题;第二排是推荐篇,指的是推荐大家使用的模式,一般不会有什么问题。 模式1:默认模式 代码复用大家常用的默认模式,往往是有问题的,该模式使用Pa