替换文本时更正UITextField中的文本光标

时间:2014-04-05 20:28:10

标签: ios objective-c uitextfield nsnotificationcenter uitextfielddelegate

我正在为键入UITextField

的文字实施快捷方式替换

例如,如果文本字段已经包含“a”并且在其后面键入另一个“a”,我将用“ä”替换它。在另一种情况下,如果他键入“a”,然后键入“b”,我将其替换为“XYZ”。如果文本包含两个连续的空格,我想用一个空格替换它们。

因此,根据用户输入的内容,我可能会用更长,更短或相同长度的文本替换它。

简单方法是实现[UITextFieldDelegate textField: shouldChangeCharactersInRange: ...委托功能,将替换文本分配给textField.text,然后返回NO。

但这也需要相应地调整光标位置,这就是我正在努力的一点点。

我正在处理这个“手动”定位的光标。它有点难看,所以我想知道是否有更优雅的解决方案。毕竟,在替换文本之后处理光标位置的所有代码(例如,当选择,然后粘贴时)已经在UITextField代码中实现。我只是想知道是否有更多的东西暴露在我的需求之中,而我还没有找到它。

1 个答案:

答案 0 :(得分:1)

我真的认为你不需要textField:shouldChangeCharactersInRange:replacementString:。有一种简单的方法可以解决您的要求,解决方案没有光标问题。

您应该在viewDidLoad中添加此行代码(self.textField是您的UITextField):

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(shortcut:) name:UITextFieldTextDidChangeNotification object:self.textField];

然后,你应该添加选择器,例如:

- (void) shortcut: (NSNotification*) notification
{
    UITextField *notificationTextField = [notification object];

    if (notificationTextField == self.textField)
    {
        [self checkDoubleA:notificationTextField];
        [self checkDoubleAB:notificationTextField];
        [self checkDoubleSpace:notificationTextField];
    }
}

然后你只需要添加3种方法来检查你的快捷方式:

-(void) checkDoubleA: (UITextField*) textField
{
    NSMutableString *string =  [textField.text mutableCopy];
    NSRange range = [string rangeOfString:@"aa"];
    if (range.location == NSNotFound)
    {
        NSLog(@"string was not found");
    }
    else
    {
        [string replaceCharactersInRange:range withString:@"ä"];
    }
    textField.text = string;
}

-(void) checkDoubleAB: (UITextField*) textField
{
    NSMutableString *string =  [textField.text mutableCopy];
    NSRange range = [string rangeOfString:@"ab"];
    if (range.location == NSNotFound)
    {
        NSLog(@"string was not found");
    }
    else
    {
        [string replaceCharactersInRange:range withString:@"XYZ"];
    }
    textField.text = string;
}

- (void) checkDoubleSpace: (UITextField*) textField
{
    NSMutableString *string =  [textField.text mutableCopy];
    NSRange range = [string rangeOfString:@"  "];
    if (range.location == NSNotFound)
    {
        NSLog(@"String was not found");
    }
    else
    {
        [string replaceCharactersInRange:range withString:@" "];
    }
    textField.text = string;
}

您可以下载此代码here的演示。