如何在UITextField中设置其值后移动光标

任何人都可以帮助我:我需要实现input数字的UITextField 。 这个数字应该总是用十进制格式,例如12.3456或12.3400。 所以我创build了NSNumberFormatter ,可以帮助我NSNumberFormatter小数位。

我正在设置UITextField

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string方法。 我处理input,使用格式化程序,最后调用[textField setText: myFormattedValue];

这工作正常,但这个调用也移动光标到我的领域的末尾。 这是不需要的。 例如我在我的字段中有12.3400,光标位于最开始,用户键入数字1.结果值是112.3400,但光标在最后移动。 当用户期望时,我想用光标结束(最近添加的数字1之后)。 有一些关于在TextView设置光标的主题,但是这是UITextField 。 我也尝试捕获字段的selectedTextRange ,它正确地保存了光标位置,但是在setText方法调用之后,这自动地改变并且原始UITextRange丢失(改变为当前)。 希望我的解释清楚。

请在这件事上给予我帮助。 非常感谢你。

编辑 :最后,我决定切换function,改变整个编辑后的格式,工作足够好。 我已经通过添加一个select器forControlEvents:UIControlEventEditingDidEnd

UITextField.text属性更改后,任何以前对与旧文本关联的UITextPositionUITextRange对象的引用都将在设置文本属性后设置为零。 在设置文本属性之前,您需要存储文本偏移量后的操作。

这对我有效(注意,如果你在下面的例子中删除了任何字符,你必须testingcursorOffset是否是<textField.text.length):

 - (BOOL) textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange) range replacementString:(NSString *) string { UITextPosition *beginning = textField.beginningOfDocument; UITextPosition *start = [textField positionFromPosition:beginning offset:range.location]; UITextPosition *end = [textField positionFromPosition:start offset:range.length]; UITextRange *textRange = [textField textRangeFromPosition:start toPosition:end]; // this will be the new cursor location after insert/paste/typing NSInteger cursorOffset = [textField offsetFromPosition:beginning toPosition:start] + string.length; // now apply the text changes that were typed or pasted in to the text field [textField replaceRange:textRange withText:string]; // now go modify the text in interesting ways doing our post processing of what was typed... NSMutableString *t = [textField.text mutableCopy]; t = [t upperCaseString]; // ... etc // now update the text field and reposition the cursor afterwards textField.text = t; UITextPosition *newCursorPosition = [textField positionFromPosition:textField.beginningOfDocument offset:cursorOffset]; UITextRange *newSelectedRange = [textField textRangeFromPosition:newCursorPosition toPosition:newCursorPosition]; [textField setSelectedTextRange:newSelectedRange]; return NO; } 

这里是快速的版本:

 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let beginning = textField.beginningOfDocument let start = textField.positionFromPosition(beginning, offset:range.location) let end = textField.positionFromPosition(start!, offset:range.length) let textRange = textField.textRangeFromPosition(start!, toPosition:end!) let cursorOffset = textField.offsetFromPosition(beginning, toPosition:start!) + string.characters.count // just used same text, use whatever you want :) textField.text = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string) let newCursorPosition = textField.positionFromPosition(textField.beginningOfDocument, offset:cursorOffset) let newSelectedRange = textField.textRangeFromPosition(newCursorPosition!, toPosition:newCursorPosition!) textField.selectedTextRange = newSelectedRange return false } 

实现本答案中描述的代码: 将光标移动到UITextField的开头

 NSRange beginningRange = NSMakeRange(0, 0); NSRange currentRange = [textField selectedRange]; if(!NSEqualRanges(beginningRange, currentRange)) { [textField setSelectedRange:beginningRange]; } 

编辑:从这个答案 ,它看起来像你可以只用你的UITextField这个代码,如果你使用iOS 5或以上。 否则,您需要使用UITextView。

这是一个快速的3版本

 extension UITextField { func setCursor(position: Int) { let position = self.position(from: beginningOfDocument, offset: position)! selectedTextRange = textRange(from: position, to: position) } } 

实际上为我工作的非常简单,只是使用dispatch main async:

 DispatchQueue.main.async(execute: { textField.selectedTextRange = textField.textRange(from: start, to: end) })