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