Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在替换UITextField的文本时更正其文本光标_Ios_Objective C_Uitextfield_Nsnotificationcenter_Uitextfielddelegate - Fatal编程技术网

Ios 在替换UITextField的文本时更正其文本光标

Ios 在替换UITextField的文本时更正其文本光标,ios,objective-c,uitextfield,nsnotificationcenter,uitextfielddelegate,Ios,Objective C,Uitextfield,Nsnotificationcenter,Uitextfielddelegate,我正在为键入到UITextField中的文本实现快捷方式替换 例如,如果文本字段已经包含“a”,他在后面键入另一个“a”,我会将其替换为“ä”。在另一种情况下,如果他键入“a”,然后键入“b”,我会将其替换为“XYZ”。如果文本包含两个连续的空格,我想用一个空格替换它们 因此,根据用户键入的内容,我可能会将其替换为更长、更短或相同长度的文本 实现此操作的简单方法是实现[uitextfield委托textField:shouldChangeCharactersInRange:…委托函数,将替换文本

我正在为键入到
UITextField
中的文本实现快捷方式替换

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

因此,根据用户键入的内容,我可能会将其替换为更长、更短或相同长度的文本

实现此操作的简单方法是实现
[uitextfield委托textField:shouldChangeCharactersInRange:…
委托函数,将替换文本分配给
textField.text
,并返回NO

但这也需要相应地调整光标的位置,这就是我正在努力解决的问题


我目前正在“手动”处理此光标定位。它有点难看,因此我想知道是否有更优雅的解决方案。毕竟,在替换文本后(例如,选择,然后粘贴)处理光标位置的所有代码已经在
UITextField
代码中实现了。我只是想知道是否有更多的内容是为了满足像我这样的需求而公开的,我还没有找到它。

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

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

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

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

您可以下载这段代码的演示。

我希望我的答案可以帮助您感谢我的努力,但您的解决方案与我试图解释的问题相同:如果您将文本光标移到左侧,例如在其他字符之间,键入将使光标重设到输入行的末尾,因为设置textField.text就是这样做的(另外,把它放在github上也是个好主意,不过如果你没有为iPad实现代码/nib,你就不应该包括它,因为人们可能会想为什么什么都没发生:)@ThomasTempelmann那么你的问题是什么。我的解决方案与游标没有问题,因为是在给小费时进行检查。也许我遗漏了什么。挑战是确保用户仍然可以编辑他键入的文本,即返回并插入随后也会展开的文本。要使这项工作正常,需要调整游标位置每次替换快捷方式后都会仔细调整,我想知道是否有一种方法不需要我自己保存和更新选择范围,而是在替换部分键入的文本时自动进行。@ThomasTempelmann我现在知道了你的问题。当然,如果你想保持光标在正确的位置,你应该这样做使用
NSRange
手动执行。我确信这是一个小方法。无论如何,
[NSNotificationCenter defaultCenter]<代码> > UITExtFieldTraveDeXeNoCudio这是一个比委托更好的方法。谢谢,我会考虑使用您的代码路径,因为我同意它是更好的进行文本替换的地方。虽然不会真正回答我的问题,但不会给您复选。不过,我很感谢您的努力和建议。
-(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;
}