项目中需要在UITextView上识别URL,手机号码、邮箱地址等等信息。那么就用到了它的dataDetectorTypes属性。我的UITextView加在UITableViewCell上面的,当单元格多起来,重用的时候就发现文字的颜色出现了错乱问题,纠结了很久。之前单元格重用的时候就没有遇到过这种问题。仔细检查了一下,发现问题出在设置颜色和设置文字的顺序上面。

据我的理解:

UITextView设置了dataDetectorTypes,当赋值给它的text属性时会先用它的系统默认字体颜色处理普通文本和URL等信息(URL等是蓝色,其他是黑色),所以如果在给它的text赋值之前设置颜色相当于没用,因此要在设置为本之后再设置颜色,颜色重置。

 

下面是UITableViewCell的代码:

#import <UIKit/UIKit.h>

@interface HaveTextViewTableViewCell : UITableViewCell

{

UITextView *textView;

}

-(void)refreshWithRow:(NSInteger)row andText:(NSString *)text;

+(float)height;

@end

=====================.m文件:=======================================

#import "HaveTextViewTableViewCell.h"

@implementation HaveTextViewTableViewCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

{

self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

if (self)

{

textView = [[UITextView alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];

textView.editable = NO;

textView.dataDetectorTypes = UIDataDetectorTypeAll;

if([[[UIDevice currentDevice]systemVersion]floatValue]>=7.0)

{

textView.selectable = YES;//用法:决定UITextView 中文本是否可以相应用户的触摸,主要指:1、文本中URL是否可以被点击;2、UIMenuItem是否可以响应

}

textView.font = [UIFont systemFontOfSize:16];

[self.contentView addSubview:textView];

}

return self;

}

-(void)refreshWithRow:(NSInteger)row andText:(NSString *)text

{

//1.这种情况下会出现单元格重用的时候字体颜色不对应,而且长按都会出现UIActionSheet的问题!!!

//    UITextView设置了dataDetectorTypes,当赋值给它的text时会先用系统默认字体颜色处理,在设置为本之后再设置颜色,颜色重置。

//    UIColor *color = row%2==0?[UIColor redColor]:[UIColor blackColor];

//    textView.textColor = color;

//    textView.text = text;

//2.这种情况下不会出现上面的情况

textView.text = text;

UIColor *color = row%2==0?[UIColor redColor]:[UIColor blackColor];

textView.textColor = color;

}

+(float)height

{

return 50;

}

- (void)awakeFromNib {

// Initialization code

}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

[super setSelected:selected animated:animated];

// Configure the view for the selected state

}

@end

=========UIViewController中的代码和UITableView的数据源============

dataArray = [NSMutableArray arrayWithCapacity:50];

for(NSInteger i=0;i<50;i++)

{

NSString *str = @"测试";

if(i%2==0)

{

str = [NSString stringWithFormat:@"%ld 测试 15021198368",i];

}

[dataArray addObject:str];

}

UITableView *tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain];

tableView.dataSource = self;

tableView.delegate = self;

[self.view addSubview:tableView];

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

return dataArray.count;

}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

return [HaveTextViewTableViewCell height];

}

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

{

static NSString *cellIdentifier = @"cellIdentifier";

HaveTextViewTableViewCell *cell = (HaveTextViewTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if(cell==nil)

{

cell = [[HaveTextViewTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

}

[cell refreshWithRow:indexPath.row andText:[dataArray objectAtIndex:indexPath.row]];

return cell;

}

这样当UITableView滑动几下,所有的文字颜色都变成了蓝色,都像是超链接了,长按都会出现UIActionSheet。

同步自网易博客 (查看原文)

使用UITextView的dataDetectorTypes实现超链接需要注意的事项!的更多相关文章

  1. ios 开发UI篇—UITextView

    概述 UITextView可滚动的多行文本区域 UITextView支持使用自定义样式信息显示文本,并支持文本编辑.您通常使用文本视图来显示多行文本,例如在显示大型文本文档的正文时. UITextVi ...

  2. IOS 学习笔记(5) 控件 文本视图(UITextView)的使用方法

    相对于UILabell所支持的较短文本内容,UITextView对于长文本的支持更好.UITextView能够以滚动的方式全部浏览到长文本,并且就像UILabel那样,从ISO6,他也提供了对NSAt ...

  3. 你真的了解UITextView吗?

    一:首先查看一下关于UITextView的定义 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITextView : UIScrollView <UITextI ...

  4. UITextView的使用详解

    //初始化并定义大小 UITextView *textview = [[UITextView alloc] initWithFrame:CGRectMake(20, 10, 280, 30)]; te ...

  5. Swift - 多行文本输入框(UITextView)

    1,多行文本控件的创建 1 2 3 4 let textview = UITextView(frame:CGRect(x:10, y:100, width:200, height:100)) text ...

  6. UITextView打开文字中的URL

    1. 背景介绍 UITextView里显示的文字带有url,点击url可以打开对应的网页,可以分两种打开方式:(1)在App内打开url:(2)用safari打开url. 2. 实现代码: (1)声明 ...

  7. iOS - UITextView

    前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITextView : UIScrollView <UITextInput> @available(i ...

  8. TextKit学习(三)NSTextStorage,NSLayoutManager,NSTextContainer和UITextView

    先上一张图: 这是使用UITextView时用到的iOS7新增加的类:NSTextContainer.NSLayoutManager.NSTextStorage及其相互关系: 这三个新出的类还没有在官 ...

  9. 【转】UITextView的使用详解

    //初始化并定义大小 UITextView *textview = [[UITextView alloc] initWithFrame:CGRectMake(20, 10, 280, 30)]; te ...

随机推荐

  1. Redis学习01——介绍与搭建环境

    Redis学习01介绍与搭建环境一简介二yum配置已经配置了的可以跳过三安装gcc四安装redis1 上传Redis到linux中2 解压到usrlocal下3 编译redis4 安装redis5 拷 ...

  2. SSH免密登录设置

    ******配置主机之间的免密ssh登陆 假如 A  要登陆  B 在A上操作: (1)首先生成密钥对 ssh-keygen   (提示时,直接回车即可) (2)再将A自己的公钥拷贝并追加到B的授权列 ...

  3. rabbitmq实现单发送单接收

    1.创建两个项目.都使其支持rabbitmq (1)在pom.xml文件中添加支持rabbitmq的jar包 <dependency> <groupId>org.springf ...

  4. MaxCompute 最新特性介绍 | 2019大数据技术公开课第三季

    摘要:距离上一次MaxCompute新功能的线上发布已经过去了大约一个季度的时间,而在这一段时间里,MaxCompute不断地在增加新的功能和特性,比如参数化视图.UDF支持动态参数.支持分区裁剪.生 ...

  5. beanstalkd 消息队列发邮件

    放入消息 /** * 获取beanstalk实例 * * @staticvar resource|bool $beanstalk * @return resource */ function get_ ...

  6. Codeforces 222B 数组行列交换操作

    /*做完这题发现自己好水,太伤人了.... 不过还是学到一些,如果直接暴力模拟的话肯定是TLM.. 所以要用虚拟数组来分别保存当前数组的每行没列在初始数组中的位置...*/ #include<c ...

  7. Mac OS X中,有三种方式来实现启动项的配置

    Mac OS x 启动项设置 Mac OS X的启动原理: 1,mac固件激活,初始化硬件,加载BootX引导器. 2,BootX加载内核与内核扩展(kext). 3,内核启动launchd进程. 4 ...

  8. Codeforces 220B

    B. Little Elephant and Array time limit per test 4 seconds memory limit per test 256 megabytes input ...

  9. gin入门-1

    Gin框架介绍 1. 简介Gin框架介绍A. 基于httprouter开发的web框架.http://github.com/julienschmidt/httprouterB. 提供Martini风格 ...

  10. 为什么要使用ul li布局网站导航条?使用ul li布局网站网页导航必要性

    会布局的都知道网站导航条布局非常重要,可能一个导航条最终布局效果有时可以使用ul li列表标签布局,有时可以不用ul li布局,而是直接一个div盒子里直接放锚文本超链接的栏目名称,也能实现,看下图. ...