任何人可以帮助我这样的:我需要实现UITextField
输入号码。 这个数字应该始终以十进制格式有4个地方,例如12.3456或12.3400。 所以我创建NSNumberFormatter
,可以帮助我带小数位。
我设置UITextField
价值
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
方法。 我proccess输入,使用格式化,最后调用[textField setText: myFormattedValue];
这工作得很好,但这一呼吁也将光标移动到我场结束。 这是不必要的。 例如,我有12.3400在我的领域,将光标定位在一开始就和用户类型数量。将其结果值是112.3400但光标在最后感动。 我想,当用户希望用光标结束(刚过最近添加1号)。 有关于设置光标一些议题TextView
但这UITextField
。 我还试图抓住selectedTextRange
领域,其适当保存光标位置,但之后setText
方法调用,这个自动改变和原点UITextRange
丢失(更改为当前)。 希望我的解释是明确的。
请在这件事上给予我帮助。 非常感谢你。
编辑 :最后,我决定将功能切换到改变整个编辑后的格式和作品不够好。 我已经加入了选择做了forControlEvents:UIControlEventEditingDidEnd
。
后UITextField.text
属性更改,以以往任何引用UITextPosition
或UITextRange
后您设置文本属性,用旧的文本关联的对象将被设置为零。 你需要存储文本偏移会是什么后手术进行之前设置的文本属性。
这为我工作(注意,你必须测试cursorOffset是否<textField.text.length如果您在t在下面的例子中删除任何字符):
- (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
}
这里是一个快速的版本3
extension UITextField {
func setCursor(position: Int) {
let position = self.position(from: beginningOfDocument, offset: position)!
selectedTextRange = textRange(from: position, to: position)
}
}
实现这个答案描述的代码: 将光标移动到的UITextField的开始
NSRange beginningRange = NSMakeRange(0, 0);
NSRange currentRange = [textField selectedRange];
if(!NSEqualRanges(beginningRange, currentRange))
{
[textField setSelectedRange:beginningRange];
}
编辑:从这个答案 ,它看起来像你可以,如果你使用的是iOS 5或以上才使用此代码与您的UITextField。 否则,你需要使用一个UITextView来代替。
究竟是什么工作对我来说是非常简单的,只是用来调度主异步:
DispatchQueue.main.async(execute: {
textField.selectedTextRange = textField.textRange(from: start, to: end)
})