自定义键盘输入与系统一致的问题

前段时间自定义过一个VIN码输入的键盘,但是没有考虑怎样跟系统键盘操作一致的问题。客户反馈没法移动光标后,在移动后光标的位置进行添加或删除操作,所以进行了优化。

想要在光标的位置进行添加字符首先要获取当前光标所在的位置(range),在UITextInput.h中发现如下属性

- (void)setMarkedText:(nullable NSString *)markedText selectedRange:(NSRange)selectedRange; // selectedRange is a range within the markedText

所以获取光标所在位置直接 textField.selectedTextRange。

在当前range追加字符其实就是对该range的字符进行替换,在UITextInput.h中发现如下方法:

- (void)replaceRange:(UITextRange *)range withText:(NSString *)text;

/* Text may have a selection, either zero-length (a caret) or ranged.  Editing operations are
 * always performed on the text from this selection.  nil corresponds to no selection. */

所以在键盘按下按钮的时候应该做如下处理:

[textField replaceRange:textField.selectedTextRange withText:sender.titleLabel.text];

删除光标所在位置字符:

[textField deleteBackward];

另外如果是searchBar的话:

UITextField *tf = [((UIView *)[_VINSearchView.VINSearchBar.subviews objectAtIndex:0]).subviews lastObject];
[tf replaceRange:tf.selectedTextRange withText:btn.titleLabel.text];
/*删除操作如下*/
UITextField *tf = [((UIView *)[_VINSearchView.VINSearchBar.subviews objectAtIndex:0]).subviews lastObject];
[tf deleteBackward];

哦原来自定义的VIN码键盘在这。

只要在原来的代理方法里面添加上述处理就行了。



你可能感兴趣的:(备忘)