TextField的输入问题

本文介绍在UITextField中如何处理光标位置、字符增删等问题。包括获取和修改光标位置的方法,以及实现字符串删除和插入的同时调整光标位置的技巧。
TextField的输入问题
TextField的常见操作有选择光标的位置,然后进行增删改,目前工作中遇到了这个问题,是在自定义的键盘输入时遇到的,当然如果用的是系统自带的键盘,是不用这么麻烦的。这里也只是记录下本次修改bug中遇到的问题以及解决方法。
问题描述:在一个TextField中修改字符串时,需要在光标的当前位置删除前一个字符或者增加一个字符,并且光标也随之移动;如果小数点前只有一个数字,那么不能删除该数字;字符串不能以小数点开头
这里涉及到一个光标位置的问题,做出以下总结:
// 获取光标的位置信息(光标是可以选择一段文字的)。UITextRange 包含两个坐标,光标的起点位置start和光标的终点位置end
UITextRange *textRange = textField.selectedTextRange;

// 光标的位置信息都是 UITextPosition 类型,可以看成一个标记的点
UITextPosition *beginning = textField.beginningOfDocument;  //textField中的最左边位置,记为0;
UITextPosition *selectionStart = textField.start;
UITextPosition *selectionEnd = textField.end;


// 能获取到位置信息,那么也够修改他的位置也不在话下;
// 第一个参数是起点位置,第二个是光标偏移的方向,第三个是偏移量
UITextPosition *start = [textField positionFromPosition:[textField.start] inDirection:UITextLayoutDirectionLeft offSet:1];


// 在得到start之后,就可以设置他的光标起点了。这里默认start = end 是一样的,即不存在选择一段文字的情况
if (start) {
	[textField setSelectedTextRange:[textField textRangeFromePosition:start toPosition:start]];
}

// 字符串进行删除操作。操作之前将光标位置保存
NSMutableString *mutableString = [NSMutableString stringWithString:textField.text];
[mutableString deleteCharactersInRange:NSMakeRange(2,1)];


// 删除之后需要将光标位置往左移一格
UITextPosition *start = [textField positionFromPosition:[textRange start] inDirection:UITextLayoutDirectionLeft offSet:1];

// 增加操作,结束之后光标往后移一格
UITextPosition *beginning = textField.beginningOfDocument; 
UITextPosition *start = textField.selectedTextRange.start;
// 将光标的位置转化为 NSInteger 类型数据
const NSInteger index = [textField offsetFromPosition:beginning toPosition:start];
[mutableString insertString:number atIndex:index];
UITextPosition *start = [textField positionFromPosition:[textRange start] inDirection:UITextLayoutDirectionRight offSet:1];

// 这样就解决了光标的位置偏移问题
关于UITextRange 和NSRange的问题:两者是可以相互转化的,

UITextRange 转 NSRange:
UITextRange *textRange = textField.selectedTextRange;
const NSInteger location = [textField offsetFromPosition:beginning toPosition:start];
const NSInteger length = [textField offsetFromPosition:start toPosition:end];
NSRange range = NSMakeRange(location, length);

// NSRange 转 UITextRange 可以看前面的设置光标的位置



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值