在 UITextField 中添加删除绑定(绑定删除)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在 UITextField 中添加删除绑定(绑定删除)相关的知识,希望对你有一定的参考价值。
- 要解决的问题
在输入框中,需要整体删除诸如 “[email protected]” 或 “@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 != 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; 可以直接拿到删除事件,所以也可以从这方面去着手处理删除绑定
以上是关于在 UITextField 中添加删除绑定(绑定删除)的主要内容,如果未能解决你的问题,请参考以下文章
RxSwift:将 RX 绑定添加到 UITextField 时出错:“Binder<String?>”类型的值没有成员“debounce”
在 UITextField 与 UIViewRepresentable 和 SwifUI 之间绑定文本时出现问题