设置UITextField文本的格式,而无需将光标移到末尾

在处理了一个新的文本条目之后,我试图将NSAttributedString样式应用到UITextField。问题是,每当我替换文本时,每次更改光标都会跳到最末端。这是我目前的方法

立即接收并显示文本更改(当I返回false并手动执行文本替换时,同样的问题也适用)

func textField(textField:UITextField!,shouldChangeCharactersRange:NSRange,replacementString:string!)->布尔{
let range:NSRange=NSRange(位置:range.location,长度:range.length)
让newString=(textField.text作为NSString.stringByReplacingCharactersInRange(range,withString:string);
返回真值
}

我已订阅UITextFieldTextDidChangeNotification通知。这将触发样式设置。当文本被更改时,我使用一些format()函数将其替换为格式化版本(NSAttributedString

func textFieldTextDidChangeNotification(用户信息:NSDictionary){
var attributedString:NSMutableAttributedString=NSMutableAttributedString(string:fullString)
attributedString=格式(textField.text)为NSMutableAttributedString
textField.attributedText=attributedString
}

这样的造型效果很好。但是,每次替换文本后,光标都会跳到字符串的末尾。如何关闭此行为或手动将光标移回开始编辑的位置…还是有更好的解决方案在编辑时设置文本样式

执行此操作的方法是获取光标的位置,更新字段内容,然后将光标替换到其原始位置。我不确定Swift中的确切等效项,但以下是我在Obj-C中的实现方式

-(BOOL)textField:(UITextField*)textField应更改字符范围:(NSRange)范围替换字符串:(NSString*)字符串
{
UITextPosition*开始=textField.beginingofDocument;
UITextPosition*cursorLocation=[textField positionFromPosition:起始偏移量:(range.location+string.length)];
textField.text=[textField.text stringByReplacingCharactersInRange:range with string:string];
/*根据需要在此处更改字段内容*/
//如果在字符串末尾输入文本,则光标位置将为(null)
//如果已经结束,则无需更改位置,因为它将默认为结束
if(光标位置)
{
//将“开始/结束位置”设置为相同的点,以便不突出显示任何内容
[textField setselectedtextange:[textField textRangeFromPosition:cursorLocation toPosition:cursorLocation]];
}
返回否;
}

发表评论