在 UITextField 中添加删除绑定(绑定删除)
- 要解决的问题
在输入框中,需要整体删除诸如 “xxx@xx.com” 或 “@xxxx” 等文本
- 实现思路
在删除动作时,获取到当前光标的位置,如果在光标正在处在上述文本范围内,就删除一整串文本
- 如何实现 (仅用 UITextField 示例, UITextView 实现原理是一样的)
- 为 UITextField 的 UITextFieldDelegate 实现 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; 方法,在这个方法里面,当 replacementString 返回来的长度是 0 时,即表示输入了删除键,这样我们知道了删除动作的时机。
- 获取删除时的光标位置,光标位置是个相对位置,可以是相对于输入框文本的 begin 位置或者是 end 位置,这里取相当于 begin 的位置 NSInteger cursorOffset = [textField offsetFromPosition:textField.beginningOfDocument toPosition:textField.selectedTextRange.start];
- 判断是否在目标字符串的范围内,如果是,就删除整个目标字符串
- 第3步的删除动作完成后,将光标移动到删除时的位置
- 代码示例
整个过程的关键,就是对 textField:shouldChangeCharactersInRange:replacementString 的实现。代码如下
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (string.length != ) {
return YES;
}
if (self.quoteText.length == ) { // quoteText 就是目标字符串
return YES;
}
// 计算当前光标相对于文本开始位置的偏移量
NSInteger cursorOffset = [textField offsetFromPosition:textField.beginningOfDocument toPosition:textField.selectedTextRange.start]; NSRange foundRange = [textField.text rangeOfString:self.quoteText];
if (foundRange.location != NSNotFound) {
if (foundRange.location <= cursorOffset &&
foundRange.length + foundRange.location >= cursorOffset) { textField.text = [textField.text stringByReplacingCharactersInRange:foundRange withString:@""];
// 光标移动到删除时的位置
UITextPosition *beginPosition = [textField positionFromPosition:textField.beginningOfDocument offset:foundRange.location];
UITextRange *newRange = [textField textRangeFromPosition:beginPosition toPosition:beginPosition];
[textField setSelectedTextRange:newRange]; return NO;
}
return YES;
} else {
return YES;
}
}
- 更多
- 如果需求比较复杂,比如类似 iMessage、Mail 的输入联系人时的删除绑定效果,推荐使用 YYTextView (来自 GitHub: YYText )
- 由于 UITextField 实现了 UITextInput 协议, UITextInput 协议继承自 UIKeyInput,UIKeyInput 中有 @required 的方法 - (void)deleteBackward; 可以直接拿到删除事件,所以也可以从这方面去着手处理删除绑定
在 UITextField 中添加删除绑定(绑定删除)的更多相关文章
- Visio中添加、移动或删除形状上的连接点的方法
Visio中添加.移动或删除形状上的连接点的方法 利用Visio画图时,学会使用连接点能使你的画图质量和速度大幅度提高.下面在Visio2010中,以一个例子讲述如何使用连接点. 一. 准备 1. 打 ...
- Linux中添加、修改和删除用户和用户组
宽为限 紧用功 功夫到 滞塞通 一.用户: 在创建用户时,需要为新建用户指定一用户组,如果不指定其用户所属的工作组,自动会生成一个与用户名同名的工作组.创建用户user1的时候指定其所属工作组user ...
- MySQL中添加、修改、删除约束
https://blog.csdn.net/dz77dz/article/details/82119000 主要包含的约束: 非空.唯一.check.not null.默认值.主键.外键
- Java 添加、读取和删除 Excel 批注
批注是一种富文本注释,常用于为指定的Excel单元格添加提示或附加信息. Free Spire.XLS for Java 为开发人员免费提供了在Java应用程序中对Excel文件添加和操作批注的功能. ...
- Eclipse中java向数据库中添加数据,更新数据,删除数据
前面详细写过如何连接数据库的具体操作,下面介绍向数据库中添加数据. 注意事项:如果参考下面代码,需要 改包名,数据库名,数据库账号,密码,和数据表(数据表里面的信息) package com.ning ...
- 如何管理和记录 SSIS 各个 Task 的开始执行时间和结束时间以及 Task 中添加|删除|修改的记录数
开篇语 在这篇日志中 如何在 ETL 项目中统一管理上百个 SSIS 包的日志和包配置框架 我介绍到了包级别的日志管理框架,那么这个主要是针对包这一个层级的 Log 信息,包括包开始执行和结束时间,以 ...
- 怎样Zbrush 4R7中添加和删除SubTool
添加或删除SubTool在ZBrush®软件中是非常简单易操作的,通常在用SubTool面板已经给我们提供了相应的命令来对其进行操作,它能够将一个或多个格式为ZTL的文件同时添加进SubTool里. ...
- MySql中添加用户/删除用户
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 ...
- 在Hadoop集群中添加机器和删除机器
本文转自:http://www.cnblogs.com/gpcuster/archive/2011/04/12/2013411.html 无论是在Hadoop集群中添加机器和删除机器,都无需停机,整个 ...
随机推荐
- 基于springcloud搭建项目-Feign篇(四)
上一篇已经写过ribbon客户端负载均衡的用法了,这篇主要是介绍feign的用法,首先我们必须了解feign是什么?能干嘛?怎么用? 这里简单介绍一下,然后进行代码测试 1.概述 Feign是一个声明 ...
- 分布式图数据库 Nebula Graph 的 Index 实践
导读 索引是数据库系统中不可或缺的一个功能,数据库索引好比是书的目录,能加快数据库的查询速度,其实质是数据库管理系统中一个排序的数据结构.不同的数据库系统有不同的排序结构,目前常见的索引实现类型如 B ...
- 软件基础1Word文档编辑
word文档编辑 启动Word2010 创建文档,<你好word>. 编辑文字. 保存的三种方式. ctrl+s. 点击文件选择保存,或另存为. 快速工具栏保存按钮. 设置字体 1.通过工 ...
- 03-influxdb原理
influxdb基本操作 1. influxdb与传统数据库区别 influxdb 传统数据库 database 数据库 measurement 表 points 表里的一行数据 2. 基本原理 2. ...
- C++结构体和类的区别总结及各自优缺点
结构体在栈里.而类在堆里. 结构体为值类型.而类是引用类型 结构体不能被继承,而类可以. 结构体无构造函数 类可以定义虚函数,而结构体不行. 结构在数据参数方面效率更高,简单数组的应用中成本很低.而类 ...
- 【tomcat系列】详解tomcat架构(上篇)
java中,常用的web服务器一般由tomcat,weblogic,jetty,undertwo等,但从用户使用广泛度来说,tomcat用户量相对比较大一些,当然这也基于它开源和免费的特点. 从软件架 ...
- JavaScript表单序列化的方法详解
本文介绍下,在javascript中实现表单序列化的方法,通过实例加深理解,有需要的朋友参考下吧. 在JavaScript中,可以利用表单字段的type属性,连同name和value属性一起实现对表单 ...
- mysql8 修改root密码
Navicat工具里选中mysql数据库 执行: ALTER user 'root'@'localhost' IDENTIFIED BY 'newpassward'; //newpassward 新密 ...
- scrapy框架在未登录模式下爬取文本,文件和图片的几点收获
1.什么是API接口? https://baijiahao.baidu.com/s?id=1597881116201407882&wfr=spider&for=pc 2.spider文 ...
- snmap弱口令攻击利用
科普Snmap: 简单网络管理协议(SNMP) 是专门设计用于在 IP 网络管理网络节点(服务器.工作站.路由器.交换机及HUBS等)的一种标准协议,它是一种应用层协议.具体废话就不多说了,自己百度去 ...