如何移动光标的UITextField其值设置后(how to move cursor in UITe

2019-06-25 16:49发布

任何人可以帮助我这样的:我需要实现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

Answer 1:

UITextField.text属性更改,以以往任何引用UITextPositionUITextRange后您设置文本属性,用旧的文本关联的对象将被设置为零。 你需要存储文本偏移会是什么后手术进行之前设置的文本属性。

这为我工作(注意,你必须测试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;
}


Answer 2:

这里是迅速的版本:

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
}


Answer 3:

这里是一个快速的版本3

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


Answer 4:

实现这个答案描述的代码: 将光标移动到的UITextField的开始

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

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



Answer 5:

究竟是什么工作对我来说是非常简单的,只是用来调度主异步:

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


文章来源: how to move cursor in UITextField after setting its value