uitextfield中的光标位置

时间:2010-05-06 05:39:12

标签: iphone objective-c xcode

我在我的控制器中使用自定义键盘。但是如何在uitextfiled中获取光标位置。我的要求是在文本字段的所需位置输入字符。可能吗?

3 个答案:

答案 0 :(得分:1)

假设你的代码是在self.textField是有问题的UITextField的对象的方法中。

您可以使用以下命令找到光标/选择的当前位置:

NSRange range = self.textField.selectedTextRange;

如果用户未选择文本,range.length将为0,表示它只是一个光标。不幸的是,这个属性看起来并不符合KVO,所以没有有效的方法可以在它发生变化时得到通知,但是在你的情况下这应该不是问题,因为当你回应用户交互时你可能真的只关心它你的自定义键盘。

然后您可以使用(假设newText保留自定义键盘的输入。)

[self.textField replaceRange:range withText:newText];

如果您需要随后调整光标/选择,可以使用:

self.textField.selectedTextRange = newRange;

例如,您可能希望将光标放在插入的文本之后。

更新:

在我原来的回答中,我没有注意到我正在利用我添加到UITextView的类别:

- (void)setSelectedRange:(NSRange)selectedRange
{
    UITextPosition* from = [self positionFromPosition:self.beginningOfDocument offset:selectedRange.location];
    UITextPosition* to = [self positionFromPosition:from offset:selectedRange.length];
    self.selectedTextRange = [self textRangeFromPosition:from toPosition:to];
}

- (NSRange)selectedRange
{
    UITextRange* range = self.selectedTextRange;
    NSInteger location = [self offsetFromPosition:self.beginningOfDocument toPosition:range.start];
    NSInteger length = [self offsetFromPosition:range.start toPosition:range.end];
    NSAssert(location >= 0, @"Location is valid.");
    NSAssert(length >= 0, @"Length is valid.");
    return NSMakeRange(location, length);
}

然后替换使用self.textField.selectedRange而不是self.textField.selectedTextRange,并按照我的描述进行操作。

感谢omz指出我的错误。

当然,您可以直接使用UITextRange,但至少在我的情况下,这被证明是相当笨拙的。

答案 1 :(得分:0)

答案是,您无法获取可以使用文本字段完成的所有类型编辑的当前光标位置。您可以使用[textField paste]在光标处插入字符,但是用户可以移动光标,选择和修改文本,而无法通知光标到达的位置。

您可以暂时粘贴特殊字符并在字符串中搜索其位置,将其删除,然后添加您想要的字符。

答案 2 :(得分:0)

<强>夫特

获取光标位置:

if let selectedRange = textField.selectedTextRange {
    let cursorPosition = textField.offsetFromPosition(textField.beginningOfDocument, toPosition: selectedRange.start)
}

在任意位置输入文字:

let arbitraryValue: Int = 5
if let newPosition = textField.positionFromPosition(textField.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: arbitraryValue) {

    textField.selectedTextRange = textField.textRangeFromPosition(newPosition, toPosition: newPosition)
    textField.insertText("Hello")
}

我的完整答案是here