2009-09-30 117 views
45

我有一个UITextField,我强制格式化通过修改更改通知处理程序中的文本。这工作很好(一旦我解决了重入问题),但留给我更多的唠叨问题。 如果用户将光标移动到字符串末尾以外的某个位置,则我的格式更改将其移动到字符串的末尾。这意味着用户不能一次插入多个字符到文本字段的中间。 有没有办法记住然后重置UITextField中的光标位置?控制在UITextField中的光标位置

+3

有关获取和设置光标位置,插入文本斯威夫特答案。 http://stackoverflow.com/a/34922332/3681880 – Suragch 2016-01-21 11:37:40

回答

0

我不认为有一种方法可以将光标放置在您的UITextField的特定位置(除非您非常棘手并且模拟了触摸事件)。相反,我会处理格式,当用户有完成编辑他们的文本(在textFieldShouldEndEditing:),如果他们的条目不正确,不要让文本字段完成编辑。

+3

我认为,但我正在实现类似于你在ATM输入数字的方式。十进制是永远存在的,当你键入数字,他们移动到左侧,以便在第一0.01进入1-0-5-0的结果,那么0.10,1.05,10.50。 要做到这一点,在年底将允许1050在现场,然后将其更改为10.50这是相当混乱给用户。 – Jeremy 2009-09-30 23:15:22

3

我终于找到了解决这个问题的办法!你可以把你需要插入到系统粘贴板的文本,然后将其粘贴在当前光标所在位置:

[myTextField paste:self] 

我发现这个人的博客解决方案:
http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html

的粘贴功能是特定于OS V3.0,但是我已经测试过它,它对我来说用自定义键盘工作正常。

如果您采用这种解决方案,那么您应该保存用户现有的剪贴板内容并在之后立即恢复。

+1

这应该是被接受的答案。 – banDedo 2012-10-12 01:20:25

+13

修改用户的剪贴板?这似乎是会让我疯狂的东西。你可以在完成后恢复剪贴板吗? – colinta 2013-08-22 17:06:59

64

控制UITextField中的光标位置很复杂,因为输入框和计算位置涉及到很多抽象。但是,这当然是可能的。您可以使用成员函数setSelectedTextRange

[input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]]; 

这里是一个函数,它接受一个范围,在这个范围内选择的文本。在的UITextField input

+ (void)selectTextForInput:(UITextField *)input atRange:(NSRange)range { 
    UITextPosition *start = [input positionFromPosition:[input beginningOfDocument] 
               offset:range.location]; 
    UITextPosition *end = [input positionFromPosition:start 
               offset:range.length]; 
    [input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]]; 
} 

例如,将光标置于idx:如果你只是想将光标放在某个索引,只需使用范围长度为0

[Helpers selectTextForInput:input 
         atRange:NSMakeRange(idx, 0)]; 
+0

干得好。这对我很有用,而且很灵活。 – LostInTheTrees 2014-03-26 01:20:17

+0

总的想法是好的,但是这个代码要驻留在上的NSTextField类别,喜欢这里:https://github.com/MaxZeng/UITextField-SelectedRange/blob/master/UITextFieldSelectedRange/UITextField%2BSelection.m – osxdirk 2015-03-13 08:19:15

+1

抱歉,它不起作用,光标停留在最后... iOS 8.0在这里。 – 2015-03-28 17:19:38

-2

这里是对这个问题的正常工作的一个片段:

- (void)textFieldDidBeginEditing:(UITextField *)textField{ 
    UITextPosition *positionBeginning = [textField beginningOfDocument]; 
    UITextRange *textRange =[textField textRangeFromPosition:positionBeginning 
                toPosition:positionBeginning]; 
    [textField setSelectedTextRange:textRange]; 
} 

Source from @omz

2

这是@Chris R的Swift版本 - 更新的Swift3

private func selectTextForInput(input: UITextField, range: NSRange) { 
    let start: UITextPosition = input.position(from: input.beginningOfDocument, offset: range.location)! 
    let end: UITextPosition = input.position(from: start, offset: range.length)! 
    input.selectedTextRange = input.textRange(from: start, to: end) 
} 
0

随意使用这个UITextField类来获取和设置光标位置:

@interface UITextField (CursorPosition) 

@property (nonatomic) NSInteger cursorPosition; 

@end 

-

@implementation UITextField (CursorPosition) 

- (NSInteger)cursorPosition 
{ 
    UITextRange *selectedRange = self.selectedTextRange; 
    UITextPosition *textPosition = selectedRange.start; 
    return [self offsetFromPosition:self.beginningOfDocument toPosition:textPosition]; 
} 

- (void)setCursorPosition:(NSInteger)position 
{ 
    UITextPosition *textPosition = [self positionFromPosition:self.beginningOfDocument offset:position]; 
    [self setSelectedTextRange:[self textRangeFromPosition:textPosition toPosition:textPosition]]; 
} 

@end 
4

有用的索引位置(斯威夫特3 )

private func setCursorPosition(input: UITextField, position: Int) { 
    let position = input.position(from: input.beginningOfDocument, offset: position)! 
    input.selectedTextRange = input.textRange(from: position, to: position) 
}