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

时间:2010-06-30 14:07:55

标签: iphone cocoa-touch uitextfield

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


然后用户插入字符 F***** FO **** FOO *** 等...

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

感谢名单

-G -

1 个答案:

答案 0 :(得分:7)

<强>更新

在iOS5及更高版本中可以执行此操作,因为UITextField和UITextView符合UITextInput协议。请看一下:“Can I select a specific block of text in a UITextField?”例如:)。

希望有所帮助


OLD ANSWER:(iOS4.x及以下版本):

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

selectionRange
setSelectionRange:

下面的代码工作正常(至少在模拟器4.3中),我正在使用KVC,所以我可以避免恼人的警告。 (selfUITextField

的子类的实例
- (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"];
    }
}

由于这些不是公共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])));
}