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

2023-11-19

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

首先看界面效果图:




Demo下载地址:http://download.csdn.net/detail/rhljiayou/6760745

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


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

http://blog.csdn.net/rhljiayou/article/details/17019651,讲的是正则表达式,不过里面有包含内容关于如何使@#链接 特殊字符处理的。可以通过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,代码如下:

CustomCell:

#import "CustomCell.h"

@implementation CustomCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
        _nameLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 320, 20)];
        [self addSubview:_nameLabel];
    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

@end

使用:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CustomCell";
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    
    cell.nameLabel.text = @"这是一个自定义的 name";
    
    return cell;
}


3、MVC 的思想

现在完整 app 都会从后台取数据,如果数据很复杂,你会如何让他们显示在界面上。

比如以下数据是从后台取出来的:

{
"name": "rhl",
"sex": "女",
"job": "coder",
"age": "0",
"csdn": "http://blog.csdn.net/rhljiayou",
"main": "3G/移动开发",
"qq 群": "113820038"
}

这数据算少的算简单的,我只是用这个做一下例子,真实的数据有可能很多很复杂!

拿到数据后,都会把它解析成数组对象NSMutableDictionary *dict;

有二种写法

第一种:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CustomCell";
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    
    cell.nameLabel.text = [dict objectForKey:@"name"];
    cell.sexLabel.text = [dict objectForKey:@"sex"];
    cell.jobLabel.text = [dict objectForKey:@"job"];
    cell.ageLabel.text = [dict objectForKey:@"age"];
    cell.csdnLabel.text = [dict objectForKey:@"csdn"];
    cell.mainLabel.text = [dict objectForKey:@"main"];
    cell.qqLabel.text = [dict objectForKey:@""];
    
    return cell;
}

这样也能达到预期效果,只是如果你此类中的代码非常之多,再添加这点代码其实也好,假如像我 demo 中的新浪微博中的数据,你就有可能头大了。

比如多个viewController中都用到此数据呢,你是不是也照样这样写一遍啊。由此看来,是不是感觉代码的藕合性有些高啊,就是说 view 和数据是在一块儿,有几套 view 就有几套数据这样写,那么我们为何不尝试把这些赋值的这些操作统一的就写一份儿呢?

接下来就是第二种写法:

在 CustomCell 中

-(void)setContent:(NSMutableDictionary*)dict
{
    self.nameLabel.text = [dict objectForKey:@"name"];
    self.sexLabel.text = [dict objectForKey:@"sex"];
    self.jobLabel.text = [dict objectForKey:@"job"];
    self.ageLabel.text = [dict objectForKey:@"age"];
    self.csdnLabel.text = [dict objectForKey:@"csdn"];
    self.mainLabel.text = [dict objectForKey:@"main"];
    self.qqLabel.text = [dict objectForKey:@""];
}

用法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CustomCell";
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    [cell setContent:dict];
    return cell;
}

这样,我们只需要[cell setContent:dic];就能完成赋值操作!别的界面中也用到此 cell 时只需这一行代码就完成赋值了。

我一般拿到数据后会将其字典NSMutableDictionary封装成成模型对象,这样更符合 MVC 的思想。

所谓MVC,我这里搜到一个人的回答还是瞒详细的,

也很易懂:http://zhidao.baidu.com/link?url=giaoyhccUjcAiQjWVLB_nNI7-BsLPAq-gsDz_avnAGCvaPZW3hDmxLqNYsxG8dtSi5ciLCdUMyh1AVZsKCVDVq


ok,今天就先讲到这里,虽然此文是关于新浪微博的界面,但是其涉及到知识面想讲一下,因为看到好多同学都会犯同样的错误。

如有说的不对的地方,希望同学朋友们指出并讨论。


提外话:话说今天是平安夜,各种电影演唱会都在这一天推出,祝大家玩的愉快!


转载注明原著:http://blog.csdn.net/rhljiayou

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IOS高访新浪微博界面(讲解如何自定义UITableViewCell,处理@#链接 特殊字符) 的相关文章

  • 关于时间的最小单位

    关于时间的最小单位 以前很少研究过这个问题 一次业务上的需求 要求计算的性能要求很高 添加 读取 更新数据的效率都要是毫秒以下 为了测试 不得不在代码中通过前后添加类似这样的语句来调试 long start System currentTi
  • 从零开始写一个Javascript解析器

    最近在研究 AST 之前有一篇文章 面试官 你了解过 Babel 吗 写过 Babel 插件吗 答 没有 卒 为什么要去了解它 因为懂得 AST 真的可以为所欲为 简单点说 使用 Javascript 运行Javascript代码 这篇文章
  • SSHDroid(SSH Server for Android)通过PC或命令连接android

    1 下载berserker android apps sshdroid apk 如果你懒的下载 给我留言 我会发给你 2 安装到手机 显示如图 简单解释一下 一般android系统没有root权限 Wifi Connection 是你连接的
  • 【Google测试之道】第三章 测试工程师

  • Failed to convert property value of type 'java.lang.String' to required type 'int' for property

    junit Spring 测试Service org springframework beans TypeMismatchException Failed to convert property value of type java lan
  • HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException:...

    1 HTTP Status 500 Request processing failed nested exception is java lang IllegalArgumentException Control character in
  • 【app测试】adb常用指令及华为卸载预置软件

    adb基础指令 1 adb devices 显示当前运行的全部Android设备 2 adb s 设备编号 对某一设备执行命令 3 adb install APK路径 安装应用程序 r表示replace覆盖安装 连接了多台设备时 需要指定设
  • 自学软件测试需要多久?怎么自学软件测试?自学软件测试可以找到工作吗? 绝对干货!

    一 前言 最近经常有很多朋友问我想要入行软件测试 但是都不知道该怎么学 这里详细的给大家说下 对于0基础的朋友 应该怎么去学习软件测试 学习软件测试有2条路可以选 1 找个靠谱的培训机构去培训啦 你就什么都不用想了 跟着培训结构认真的学习就
  • 高效程序员的40个好习惯和行为方式

    每一个好的习惯 开头都会相应有一个唱反调的句子哦 1 做事 出了问题 第一重要的是确定元凶 找到那个人 一旦证实了是他的错误 就可以保证这样的问题永远也不会再发生了 指责不会修复bug 把矛头对准问题的解决办法 而不是人 这是真正有用处的正
  • IOS 访问系统粘贴板

    粘贴板提供了一种核心OS特性 用于跨应用程序共享数据 用户可以跨应用来复制粘贴 也可以设置只在本应用中复制粘贴用来保护隐私 UIPasteboard类允许访问共享的设备粘贴板以及内容 下面代码返回一般的系统粘贴板 它适合大多数一般的复制粘贴
  • oracle批量绑定 forall bulk collect用法以及测试案例

    一 如何使用批挷定提高性能 How Do Bulk Binds Improve Performance 在PL SQL 和SQL引擎 engines 中 太多的上下文切换 context switches 会影响性能 这个会发生在当一个循环
  • sharedPreferences

    sharedpreferences 共享参数 也是保存数据的一种方法 通常用于持久化数据 定期更新保存数据 类似ajax的定时刷新 示例代码 主要来源于黑马教程 如下 import java util Timer import java u
  • web移动端布局的那些事儿

    原文地址 github com HuJiaoHJ bl web移动端布局范畴很广 其中比较基础的几个话题 移动端适配 1px border 基础布局 本文主要分享这三个话题 一 移动端适配 提起移动端适配 大家想到的肯定是rem flexi
  • 史上最全的《Android面试题及解析》,赶紧收藏!

    写在文章前面的话 工欲行其事 必先利其器 英雄和侠客更需要宝剑助己成功 同样 在现代软件开发环境中 每个Android开发者都需要更好的工具 帮助我们增强功能 提高效率 在这个竞争激烈的行业中 只有优秀的工程师能够生存 需要我们能够为客户提
  • IntelliJ IDEA中如何使用JUnit4

    背景 最近参与了一个Anroid医疗项目 其中项目底层有很多基础类及通讯类 而且很多涉及复杂的字节操作还有多线程同步及状态机处理 这样的项目做一下TDD还是必要的 尽量项目前期把风险降低一些 现在的问题是本人使用的是IntelliJ开发的A
  • Compile Options--编译选项

    目的 其主要作用是用于调试跟踪和测试 主要包含 MT TASK MT ZDO FUNC and other MT compile options LCD SUPPORTED LCD SUPPORTED DEBUG BLINK LEDS 且看
  • iOS 自定义弹出框

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在iOS中 系统再带的弹出窗体不好扩展 开发时候不如自定义一个弹出窗体 附加上显示和消失的动画 弹出窗体父类如下 具体效果直接往上面添加控件就行 ViewControlle
  • 基于 LoadRunner 实现企业级服务器端性能测试的实践

    后端性能测试工具首先通过虚拟用户脚本生成器生成基于协议的虚拟用户脚本 然后根据性能测试场景设计的要求 通过压力控制器控制协调各个压力产生器以并发的方式执行虚拟用户脚本 并且在测试执行过程中 通过系统监控器收集各种性能指标以及系统资源占用率
  • 008-黑盒测试和白盒测试的优缺点

    黑盒测试和白盒测试的优缺点 黑盒测试的优点有 比较简单 不需要了解程序内部的代码及实现 与软件的内部实现无关 从用户角度出发 能很容易的知道用户会用到哪些功能 会遇到哪些问题 基于软件开发文档 所以也能知道软件实现了文档中的哪些功能 在做软
  • OpenHarmony沙箱文件

    一 前言 1 前景提要 DevEcoStudio版本 DevEco Studio 3 1 Release SDK版本 3 2 2 5 API版本 9 2 概念 在openharmony文件管理模块中 按文件所有者分类分为应用文件和用户文件和

随机推荐

  • Vue中高德地图获取经纬度及逆地理解析的两种方式CDN或NPM(协议必须是https) 否则定位会一直失败

    高德地图获取经纬度 npm方式 npm i amap amap jsapi loader save import AMapLoader from amap amap jsapi loader npm方式 export function NP
  • SimSiam:Exploring Simple Siamese Representation Learning

    Siamese网络最大化了一个图像的两个增强之间的相似性 服从于避免崩溃解的某些条件 在本文中 SimSiam即使 不使用以下任何一项也可以学习有意义的表示 i 负样本对 ii 大批量 iii 动量编码器 我们的实验表明 停止梯度stop
  • 推荐工具!使终端便于 DevOps 和 Kubernetes 使用

    如果你熟悉 DevOps 和 Kubernetes 的使用 就会知道命令行界面 CLI 对于管理任务有多么重要 好在现在市面上有一些工具可以让终端在这些环境中更容易使用 在本文中 我们将探讨可以让工作流程简化的优秀工具 帮助你在 DevOp
  • ai人工智能制作视频_建立一个人工智能驱动的可搜索视频档案

    ai人工智能制作视频 In this post I ll show you how to build an AI powered searchable video archive using machine learning and Goo
  • 为什么要使用零知识证明来开发跨链协议

    用户需要什么样的跨链服务 在过去的几年当中出现了各种各样的独立公链以及以太坊 Layer 2 由于在安全性 低成本 快速交易以及开发者和用户社区差异等方面 不同链都具有各自不同的优势 用户在不同链之间切换使用的行为是很常见的 比起以太坊链
  • B端产品设计与实现总结

    Author skatexg Time 2022 03 06 适用范围 B端产品的迭代需求和研发管理总结 end
  • win10关闭电池保护模式_Windows10如何关闭电源保护模式?

    展开全部 首先 在Win10系统桌面上32313133353236313431303231363533e78988e69d8331333365633962能看到笔记本电源标志 当然台式电脑是没有这个图标的 这里的节电模式仅适用于笔记本电脑
  • 设置HTML为桌面壁纸

    我们程序员每天都面对着静态或动态壁纸 但是谁不想拥有一个炫酷的html桌面呢 先看一下效果 下面是几例使用html当桌面进行交互的实际效果 1 桌面可以玩魔方 2 飞机跟随鼠标移动 3 火箭跟随鼠标移动 4 可以通过调节参数的星空 英文自查
  • springboot-rocketmq日志rocketmq_client.log问题

    问题描述 springboot配置rocketmq后 会写入日志到rocketmqlogs目录下的rocketmq client log文件中 且日志过于庞大 解决 1 启动类增加代码 System setProperty ClientLo
  • 因果推断dowhy之-ihdp数据集上的案例学习

    0x01 案例背景 IHDP Infant Health and Development Program 就是一个半合成的典型数据集 用于研究 专家是否家访 对 婴儿日后认知测验得分 之间的关系 原数据集是基于随机控制实验进行的 因此可以获
  • matlab 曲线拟合插值问题

    引言 polyfit 和polyval 经常用于多项式拟合和插值取点 但不能乱用 原理 polyfit根据一些列的点去拟合成一个多项式 多项式的阶次可以设定 假设对于某一小段数据 如图 现在想根据当前点的变化趋势拟合多项式并插值 使用pol
  • 源码漏洞思路笔记

    根据文件名称判断内容 部分文件没有固定的名称和位置 取决于编写网站人员 以下是一般情况 admin 后台路径 data 处理数据 install 安装 menber 会员中心 temple 模板文件 bak文件 数据库备份 bak是back
  • SphereEx苗立尧:云原生架构下的Database Mesh研发实践

    嘉宾 苗立尧 2022年7月27日 在由开放原子开源基金会主办的 2022开放原子全球开源峰会 上 SphereEx Mesh实验室负责人 云原生技术专家苗立垚带来了 云原生架构下的Database Mesh的研发实践 的主题演讲 从云原生
  • bean的有效范围和生命周期(scope)

    scope 的取值范围给出了bean的生命周期 存活时间 即scope 取值决定了Tomcat服务器分配给用户的 bean 的有效范围和生命周期 因此需要理解 scope取值的具体意义 下面就JSP动作标记useBean 中scope取值的
  • conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

    conda 无法将 conda 项识别为 cmdlet 函数 脚本文件或可运行程序的名称 请检查名称的拼写 如果包括路径 请确保路径正确 然后再试一次 解决办法 没有添加系统变量 所以系统根本识别不了conda命令 找不到位置 添加以下系统
  • java fop,使用ApacheFOP从Java中的XML生成PDF

    I am trying to generate on the fly PDF reports from Java objects I have not been able to find many examples of this so I
  • Hbase的入门心得:

    Hbase的入门心得 在了解了Hadoop的大家族的核心成员HDFS MapReduce以及资源管理器YARN后 HBase又是一个新颖的技术出现 在超人学院吴超老师的视频里介绍到 HBase Hadoop Database是一个分布式的
  • 图智能在反洗钱方向的应用实践丨Fabarta 技术专栏

    导读 依托于 Fabarta 在金融行业应用图技术解决反洗钱业务领域问题成功经验 将图智能在反洗钱方向的应用实践进行总结并分享 主要包括以下几个方面 全文目录 反洗钱业务业务背景 当前反洗钱的业务流程及痛点 如何应用图智能进行反洗钱分析 案
  • Seaborn 入门

    一 Seanborn Seaborn是基于Matplotlib的Python数据可视化库 对matplotlib进行二次封装而成 它提供了一个高级界面 用于绘制引人入胜且内容丰富的统计图形 只是在Matplotlib上进行了更高级的API封
  • IOS高访新浪微博界面(讲解如何自定义UITableViewCell,处理@#链接 特殊字符)

    在开发过程中 有好多应用都会嵌入新浪微博的界面 今天整理一下代码 首先看界面效果图 Demo下载地址 http download csdn net detail rhljiayou 6760745 思路 首先放一个UITableView 自