• 要解决的问题

在输入框中,需要整体删除诸如 “xxx@xx.com” 或 “@xxxx” 等文本

  • 实现思路

在删除动作时,获取到当前光标的位置,如果在光标正在处在上述文本范围内,就删除一整串文本

  • 如何实现 (仅用 UITextField 示例, UITextView 实现原理是一样的)
  1. 为 UITextField 的 UITextFieldDelegate 实现  - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;  方法,在这个方法里面,当 replacementString 返回来的长度是 0 时,即表示输入了删除键,这样我们知道了删除动作的时机。
  2. 获取删除时的光标位置,光标位置是个相对位置,可以是相对于输入框文本的 begin 位置或者是 end 位置,这里取相当于 begin 的位置 NSInteger cursorOffset = [textField offsetFromPosition:textField.beginningOfDocument toPosition:textField.selectedTextRange.start];
  3. 判断是否在目标字符串的范围内,如果是,就删除整个目标字符串
  4. 第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 中添加删除绑定(绑定删除)的更多相关文章

  1. Visio中添加、移动或删除形状上的连接点的方法

    Visio中添加.移动或删除形状上的连接点的方法 利用Visio画图时,学会使用连接点能使你的画图质量和速度大幅度提高.下面在Visio2010中,以一个例子讲述如何使用连接点. 一. 准备 1. 打 ...

  2. Linux中添加、修改和删除用户和用户组

    宽为限 紧用功 功夫到 滞塞通 一.用户: 在创建用户时,需要为新建用户指定一用户组,如果不指定其用户所属的工作组,自动会生成一个与用户名同名的工作组.创建用户user1的时候指定其所属工作组user ...

  3. MySQL中添加、修改、删除约束

    https://blog.csdn.net/dz77dz/article/details/82119000 主要包含的约束: 非空.唯一.check.not null.默认值.主键.外键

  4. Java 添加、读取和删除 Excel 批注

    批注是一种富文本注释,常用于为指定的Excel单元格添加提示或附加信息. Free Spire.XLS for Java 为开发人员免费提供了在Java应用程序中对Excel文件添加和操作批注的功能. ...

  5. Eclipse中java向数据库中添加数据,更新数据,删除数据

    前面详细写过如何连接数据库的具体操作,下面介绍向数据库中添加数据. 注意事项:如果参考下面代码,需要 改包名,数据库名,数据库账号,密码,和数据表(数据表里面的信息) package com.ning ...

  6. 如何管理和记录 SSIS 各个 Task 的开始执行时间和结束时间以及 Task 中添加|删除|修改的记录数

    开篇语 在这篇日志中 如何在 ETL 项目中统一管理上百个 SSIS 包的日志和包配置框架 我介绍到了包级别的日志管理框架,那么这个主要是针对包这一个层级的 Log 信息,包括包开始执行和结束时间,以 ...

  7. 怎样Zbrush 4R7中添加和删除SubTool

    添加或删除SubTool在ZBrush®软件中是非常简单易操作的,通常在用SubTool面板已经给我们提供了相应的命令来对其进行操作,它能够将一个或多个格式为ZTL的文件同时添加进SubTool里. ...

  8. MySql中添加用户/删除用户

    MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 ...

  9. 在Hadoop集群中添加机器和删除机器

    本文转自:http://www.cnblogs.com/gpcuster/archive/2011/04/12/2013411.html 无论是在Hadoop集群中添加机器和删除机器,都无需停机,整个 ...

随机推荐

  1. 微信小程序注册和简单配置

    微信小程序注册 1.直接搜索微信小程序,按照流程进行注册 2.如果有微信公众号,可以在公众号内部点小程序,进入注册流程 小程序中的概念 开发设置 在开发设置中获取AppID和AppSecret App ...

  2. 关于vue-cli3打包时遇到Cannot assign to read only property 'exports' of object '#<Object>'问题的解决方法。

    vue-cli3打包时遇到Cannot assign to read only property 'exports' of object '#<Object>'问题的解决方法. 大致是说, ...

  3. java中的对象 方法 引用 等一些抽象的概念是什么意思呢?

    2020-03-14 最近这一段时间有点忙,好久都没有更新博客了,之后我会一直坚持下去的,和大家一同进步的. 这段时间一直在学java,相信刚开始学习java的小白,刚开始接触那么些抽象的概念一定和我 ...

  4. 如何使用Kibana

    目录 前言 一.安装 二.加载自定义索引 三.如何搜索数据 四.如何切换中文 五.如何使用控制台 六.可视化图表 七.使用仪表盘 前言 Kibana 是为 Elasticsearch设计的开源分析和可 ...

  5. 使用EPX Studio 7.0 下载网站验证码

    implementation var Document_: DispHTMLDocument; //用于处理网页文档对象 EPX: IExcelPanelXDisp; procedure TForm1 ...

  6. MySql锁与InnoDB引擎

    MySql锁与InnoDB引擎 mysql的锁是面试中很高频问题,也是我们在日常开发中经常会遇到但是我们并没有注意到的地方.我把我自己理解的锁通过本篇博文分享出来,由于锁需要结合事务来理解,本文只介绍 ...

  7. 基于奇林软件kylinTOP工具的HTTP2协议的压力测试

    1.HTTP协议概述 说到http,那就应该先了解一下http协议的发展历史.关于http协议的历史,可以参考阮一峰老师的这篇博客文章HTTP 协议入门,里面介绍的比较详细了.简单来说http先后存在 ...

  8. C# 基础知识系列- 1 数据类型

    常见数据类型 C#的类型一般分为值类型.引用类型两大类型. 值类型的实例存放在栈中,引用类型会在栈中放置一个指针指向堆中的某一块内容. C#为我们内置了几个数据类型供我们使用: 关键词简写 对应的类全 ...

  9. [前端开发]Vue父子组件的通信及访问

    父传子 props 子传父 自定义事件emit props传数组 props:['cmovies','cmessage'] props传对象 props:{ //1.类型限制 cmovies:Arra ...

  10. Functional mechanism: regression analysis under differential privacy_阅读报告

    Functional mechanism: regression analysis under differential privacy 论文学习报告 组员:裴建新   赖妍菱    周子玉 2020 ...