在 UITextField 中添加删除绑定(绑定删除)

  • 要解决的问题

在输入框中,需要整体删除诸如 “[email protected]” 或 “@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 != 0) {
        return YES;
    }
    if (self.quoteText.length == 0) { // 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; 可以直接拿到删除事件,所以也可以从这方面去着手处理删除绑定
时间: 2024-10-16 17:36:46

在 UITextField 中添加删除绑定(绑定删除)的相关文章

iOS:在UITextField中添加图标

//最左侧加图片是以下代码 右侧类似 UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"comment_write"]]; _textField.leftView = imgView; _textField.leftViewMode = UITextFieldViewModeAlways;

Java 添加、替换、删除Word中的图片

Java 添加.替换.删除Word中的图片 文档中,可以通过图文混排的方式来增加内容的可读性,相比纯文本文档,在内容展现方式上也更具美观性.在给文档添加图片时,可设置图片的文本环绕方式.旋转角度.图片高度/宽度等:另外,也可对文档中已有的图片实现替换.删除等操作.本文将从在Word文档中添加.替换.删除图片等三个操作需求来介绍.具体代码可参考以下示例. 工具使用:Free Spire.Doc for Java(免费版) [示例1]添加图片到Word import com.spire.doc.*;

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

批注是一种富文本注释,常用于为指定的Excel单元格添加提示或附加信息. Free Spire.XLS for Java 为开发人员免费提供了在Java应用程序中对Excel文件添加和操作批注的功能. 本文将介绍如何使用Free Spire.XLS for Java在Excel文档中添加,读取和删除批注. 安装首先你需要下载Spire.XLS JAR并将其作为依赖项添加到您的Java程序中.如果您使用的是maven,您需要将以下依赖项添加到您的pom.xml文件中. <repositories>

android 蓝牙程序控制绑定与删除绑定

如何实现android蓝牙开发 自动配对连接,并不弹出提示框 (2013-01-05 15:27:36) 转载▼ 标签: 杂谈 分类: 转摘文章 我就开始查找怎么关闭这个蓝牙配对提示框,后面还是伟大的android源码帮助了我. 在源码 BluetoothDevice 类中还有两个隐藏方法 cancelBondProcess()和cancelPairingUserInput() 这两个方法一个是取消配对进程一个是取消用户输入 下面是自动配对的代码 Mainfest,xml注册 1 <</cod

Linux中添加用户、删除用户时新手可能遇到的问题

Linux中添加用户.删除用户时新手可能遇到的问题  1.创建新用户后切换到新用户:No directory, logging in with HOME=/     添加用户     #sudo useradd -m -s /bin/bash -g group loginname     -m 创建home目录 (不加这个要手动添加目录,不然会出现No directory,Logging in with HOME=/ )     -s /bin/bash 使用bash( 默认为 /bin/sh

动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有

 1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /************************************************************************/ /*数组的结构体类型                                                    */ /*******************

在数组中添加一个元素进行(替换 删除 插入)

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //可变数组继承不可变数组 //1.创建  设定元素个数进行创建 NSMutableArray *mutArr=[NSMutableArray arrayWithCapacity:7]; //2.向数组中添加一个元素 NSArray *[email protected][@"MON",@

vector容器中添加和删除元素

添加元素: 方法一: insert() 插入元素到Vector中 iterator insert( iterator loc, const TYPE &val ); //在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器 void insert( iterator loc, size_type num, const TYPE &val ); //在指定位置loc前插入num个值为val的元素 void insert( iterator loc, input_iterator

MySql中添加用户/删除用户

MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 创建用户: mysql> insert into mysql.user(Host,User,Password) values("localhost","test",password("1234")); 这样就创建了一个名为:test 密码为: