17

我正在尝试控制 UITextField 中的光标位置。用户一次不能在文本字段的中间插入一个以上的字符。它将它移动到文本字段的末尾。所以这篇文章 SO:Control cursor position in UITextField它解决了我的问题。但我需要知道当前光标位置。

我的代码如下所示:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
   if (textField.tag == 201) 
   {
     [myclass selectTextForInput:textField atRange:NSMakeRange(idx, 0)];
   }
}

它在 idx 给我一个错误。我怎么找到那个?

4

4 回答 4

27

UITextField符合UITextInput具有获取当前选择的方法的协议。但是方法很复杂。你需要这样的东西:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if (textField.tag == 201) {
        UITextRange *selRange = textField.selectedTextRange;
        UITextPosition *selStartPos = selRange.start;
        NSInteger idx = [textField offsetFromPosition:textField.beginningOfDocument toPosition:selStartPos];

        [myclass selectTextForInput:textField atRange:NSMakeRange(idx, 0)];
    }
}
于 2013-05-08T04:04:56.420 回答
7

斯威夫特版本

if let selectedRange = textField.selectedTextRange {

    let cursorPosition = textField.offsetFromPosition(textField.beginningOfDocument, toPosition: selectedRange.start)
    print("\(cursorPosition)")
}

关于获取和设置光标位置的完整答案在这里

于 2016-01-21T11:24:01.153 回答
3

您发布的代码无法确定光标的位置。您需要 get 方法,而不是 set。它应该是这样的:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
   if (textField.tag == 201) 
   {
         UITextRange selectedRange = [textField selectedTextRange];
         // here you will have to check whether the user has actually selected something
         if (selectedRange.empty) {
              // Cursor is at selectedRange.start
              ...
         } else {
              // You have not specified home to handle the situation where the user has selected some text, but you can use the selected range and the textField selectionAffinity to assume cursor is on the left edge of the selected range or the other
              ...
         }
   }
}

有关更多信息 - 检查 UITextInput 协议http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UITextInput

更新:@rmaddy 发布了一些我在回复中遗漏的额外信息 - 如何处理来自 NSTextRange 的文本位置并将 NSTextPosition 转换为 int。

于 2013-05-08T04:02:17.563 回答
0

快速解决方案。

您可以通过继承 UITextfield 类并实现这两个方法来设置光标填充。

希望它可以帮助有需要的人。

override func textRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.inset(by: UIEdgeInsets.init(top: 4, left: 40, bottom: 1, right: 15))
}

override func editingRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.inset(by: UIEdgeInsets.init(top: 4, left: 40, bottom: 1, right: 15))
}
于 2019-03-27T13:39:44.210 回答