【问题标题】:Control cursor position in UITextField控制 UITextField 中的光标位置
【发布时间】:2010-12-02 18:46:36
【问题描述】:

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

【问题讨论】:

标签: ios iphone uitextfield uitextposition uitextrange


【解决方案1】:

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

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

这是一个函数,它接受一个范围并选择该范围内的文本。如果您只想将光标放在某个索引处,只需使用长度为 0 的范围:

+ (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]];
}

例如,将光标放在 UITextField 中的idx input:

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

【讨论】:

  • 大体思路还可以,但是这段代码想要驻留在NSTextField上的一个类别中,比如这里:github.com/MaxZeng/UITextField-SelectedRange/blob/master/…
  • 对不起,它不起作用,光标停留在最后......这里是iOS 8.0。
  • 这在 iOS 8 上非常适合我翻译成 swift,谢谢!
  • 请注意,对 becomeFirstResponder 的调用会将光标移动到末尾,因此如果需要该调用,请设置其后的位置。
【解决方案2】:

用于定位索引 (Swift 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)
}

【讨论】:

    【解决方案3】:

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

    [myTextField paste:self]  
    

    我在这个人的博客上找到了解决办法:
    http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html

    粘贴功能是特定于 OS V3.0 的,但我已经对其进行了测试,它使用自定义键盘对我来说效果很好。

    如果您选择此解决方案,那么您可能应该保存用户现有的剪贴板内容并在之后立即恢复它们。

    【讨论】:

    • 修改用户的剪贴板?这似乎会让我发疯。完成后可以恢复剪贴板吗?
    【解决方案4】:

    这是@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)
    }
    

    【讨论】:

      【解决方案5】:

      随意使用此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
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 我曾考虑过,但我正在实施的方式类似于您在 ATM 上输入数字的方式。小数点始终存在,当您键入数字时,它们会向左移动,因此输入 1-0-5-0 会首先得到 0.01,然后是 0.10、1.05、10.50。最后这样做将允许在字段中使用 1050,然后将其更改为 10.50,这对用户来说相当混乱。
        【解决方案7】:

        这里有一个 sn-p 可以很好地解决这个问题:

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

        Source from @omz

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多