IOS高访新浪微博界面(讲解如何自定义UITableViewCell,处理@#链

在开发过程中,有好多应用都会嵌入新浪微博的界面,今天整理一下代码。

首先看界面效果图:

Demo下载地址:

思路:首先放一个UITableView,自定义一个UITableViewCell,分析新浪微博中的数据,并且显示在界面上,这个稍微费一下事,主要是分析数据并且算出位置。

还有要处理@#链接 特殊字符,并以不同颜色显示出,这个可以参考另外一遍博文:

,讲的是正则表达式,不过里面有包含内容关于如何使@#链接 特殊字符处理的。可以通过AutoHyperlinks,稍加修改就可以写出完美的特殊字符处理。

今天我主要讲三点东西:1、UITableViewCell的重用机制(不要范错误)2、自定义UITableViewCell 3、MVC 的思想

为什么要讲这些,这跟今天的 Demo 有关系吗?

答:关系重大,因为我发现有的同学用 UITableView 写东西的时候把所有的东西添加到系统的 UITableViewCell中去了,,这样会导致一些问题,我觉得比较严重,所以就想写此文来让大家避免这些错误,看大家是否也范这样的错误了!

1、UITableViewCell的重用机制(不要范错误)

首先您先看这样的代码:

– (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{static NSString *CellIdentifier = @"Cell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) {cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];cell.selectionStyle = UITableViewCellSelectionStyleNone;}UILabel *nameLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 320, 20)];nameLabel.text = @"这是一个自定义的 name";[cell addSubview:nameLabel];return cell;}

感觉有问题吗?(声明一下,我写代码都用 arc,所以大家看到代码没有release,是正常不是错误。)

肯定是有问题的,看这一句:[cell addSubview:nameLabel];大家先看一下我截的图:

有没有发现,我标注那几行,字体明显比其他的粗!那是因为我把tableView划动了几行,并且是把上面两行划过屏之外了,最后一行也划过屏幕之外了。如果你觉得的不够明显,自己可以写一写。

为什么会导致此问题呢,是 UITableViewCell 的重用机制,比如我屏幕上可以显示10行,那么就会创建10个 UITableViewCell,当我划动时,上面划出屏的UITableViewCell实际上是挂起状态,下面行出现到屏上实际是不会再创建 UITableViewCell 了,而是引用上面划出屏幕的 UITableViewCell,这样以来,每次划进屏后,那个cell上都会添加nameLabel,导致重叠重叠又重叠,所以会出现字体明显比别的粗些,因为有好几个label被重叠了。

避免此错误,只要给 nameLabel 再赋上值就好了,没必要再添加到cell上。

但是,有的同学为避免这个重叠错误,这样做了,请看以下代码:

– (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{static NSString *CellIdentifier = @"Cell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) {cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];cell.selectionStyle = UITableViewCellSelectionStyleNone;}else{UILabel *label = (UILabel*)[cell viewWithTag:200];[label removeFromSuperview];}UILabel *nameLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 320, 20)];nameLabel.text = @"这是一个自定义的 name";nameLabel.tag = 200;[cell addSubview:nameLabel];return cell;}

把[label removeFromSuperview];这样解决,的确不会出现字体变粗的情况了,但是,新问题出现了。UITableViewCell 的重用机制体现何在?每个cell上都重新删除再添加,相当于每个cell都是独立的,这样就不能体现出UITableViewCell真正的优点了,它的优点就是重用机制,你只要添加一次再重新赋值就好了,为什么还要每次都重新添加,这样感觉即浪费资源又不能体现规范性还没有优点。

2、自定义UITableViewCell

如果你的 cell 上很复杂,系统cell上的View根本不够用,那么就考虑自定义cell吧。

不推荐在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath此方法中,

把所有需要的view 都添加到 cell 上。

推荐方法:

继承UITableViewCell创建自定义的CustomCell,代码如下:

与其在那里苦苦挣扎,碍于面子硬撑,倒不如微笑着面对,

IOS高访新浪微博界面(讲解如何自定义UITableViewCell,处理@#链

相关文章:

你感兴趣的文章:

标签云: