以编程方式在UiTextField中移动光标

Gio*_*lzo 5 iphone cocoa-touch uitextfield

我需要调整UiTextField行为,以便我可以以编程方式插入一些星号并将光标移动到字符串的开头; 我尝试了"粘贴"技巧(http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html),但光标在最后移动.我试图实现的效果是这样的:一开始:


然后用户插入字符f*****fo****foo***等...

这是可能的,还是我要做的调整不值得付出努力?

感谢名单

-G-

nac*_*o4d 7

更新:

在iOS5及更高版本中可以这样做,因为UITextField和UITextView符合UITextInput协议.请看一下:" 我可以在UITextField中选择一个特定的文本块吗? "作为示例:).

希望能帮助到你


老答案:(iOS4.x及以下版本):

使用公共API(我不知道)无法实现此目的.但是我发现了一些私有方法:(可能是未记录的方法,因为它们没有私有方法通常具有的下划线前缀)

selectionRange
setSelectionRange:
Run Code Online (Sandbox Code Playgroud)

下面的代码工作正常(至少在模拟器4.3中),我正在使用KVC,所以我可以避免恼人的警告.(self是子类的实例UITextField)

- (void) moveToRight{

    NSRange selectedRange = [[self valueForKey:@"selectionRange"] rangeValue];
    if (selectedRange.location != NSNotFound) {
        if (selectedRange.length > 0) {
            selectedRange.location = NSMaxRange(selectedRange);
            selectedRange.length = 0;
        }else if (selectedRange.location < self.text.length) {
            selectedRange.location += 1;
        }
        [self setValue:[NSValue valueWithRange:selectedRange] forKey:@"selectionRange"];
    }
}
- (void) moveToLeft{

    NSRange selectedRange = [[self valueForKey:@"selectionRange"] rangeValue];
    if (selectedRange.location != NSNotFound) {
        if (selectedRange.length > 0) {
            selectedRange.length = 0;
        }else if (selectedRange.location > 0) {
            selectedRange.location -= 1;
        }
        [self setValue:[NSValue valueWithRange:selectedRange] forKey:@"selectionRange"];
    }
}
Run Code Online (Sandbox Code Playgroud)

由于这些不是公共API,使用风险自负,我不知道他们是否会通过Apple的审核.

顺便说一句:我发现他们使用:

#import "/usr/include/objc/objc-runtime.h"

unsigned int methodCount = 0;
Method *mlist = class_copyMethodList([UITextField class], &methodCount);
for (int i = 0; i < methodCount; ++i){
    NSLog(@"%@", NSStringFromSelector(method_getName(mlist[i])));
}
Run Code Online (Sandbox Code Playgroud)