zoukankan      html  css  js  c++  java
  • 在 UITextField 中添加删除绑定(绑定删除)

    • 要解决的问题

    在输入框中,需要整体删除诸如 “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 != 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; 可以直接拿到删除事件,所以也可以从这方面去着手处理删除绑定
  • 相关阅读:
    关联规则挖掘算法综述
    Python中*args 和**kwargs的用法
    VIM python 自动补全插件:pydiction
    Java设计模式--工厂模式
    Java设计模式--单列设计模式
    Java设计模式--UML类图类的关系(依赖,泛化, 实现,关联,聚合,组合)
    Java设计模式--设计模式七大原则
    SpringBoot 整合篇 笔记--Spring Boot与监管/热部署
    SpringBoot 整合篇 笔记--Spring Boot与分布式
    SpringBoot 整合篇 笔记--Spring Boot与任务/安全
  • 原文地址:https://www.cnblogs.com/boch2436/p/5842724.html
Copyright © 2011-2022 走看看