2014-12-04 66 views
3

在我的text view中,当键入以“@”开头的单词时,我想禁用自动更正。原因是因为我有一个弹出窗口并提示用户名的tableview菜单。如果选择用户名,则当前文本将被替换为hyperlink。该功能与Facebook非常相似。使用“@”前缀键入单词后禁用自动更正,然后在键入新单词时重新启用

如果在我的文本视图中禁用了自动更正功能,一切都会很好。但是,如果我在文本视图中启用自动更正,则由于建议的文本,有时会混乱。这里是我的代码中,我试图改变在委托协议文本视图的自动更正属性:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range 
replacementText:(NSString *)text 
{ 

    if ([text isEqualToString:@"@"]) { 

     // text starts with "@" so we disable autocorrect 

     textView.autocorrectionType = UITextAutocorrectionTypeNo; 

    } else if ([text isEqualToString:@" "]) { 

     // empty space so we reenable autocorrect 

     textView.autocorrectionType = UITextAutocorrectionTypeYes; 
    } 

    return YES; 
} 

无论出于何种原因,即使自动更正属性正确正在改变它不工作。我在调试器中验证了textview的autocorrect属性,它肯定会被改变,但我输入时的行为不是。在需要的时候,因为自动更正菜单仍然显示当前文本下面的自动校正从来没有禁用:

enter image description here

编辑: 得到它的工作。最好的解决方案似乎是将您的响应者更改为隐藏的另一个文本视图,设置原始文本视图autocorrectType属性,然后将原始文本视图重新分配为第一响应者。这是一个小黑客,但它的作品,并不会导致键盘跳。此外,检查textViews的当前autocorrectionType属性以防止冗余的响应者分配也很重要。非常感谢Lyndsey帮助我找到答案。

  • (BOOL)的TextView:(UITextView的*)的TextView shouldChangeTextInRange:(NSRange)范围 replacementText:(的NSString *)文本 { 如果([文本isEqualToString:@ “@”] & & TextView的。 !autocorrectionType = UITextAutocorrectionTypeNo){

    // text starts with "@" so we disable autocorrect 
    [self.hiddenTextView becomeFirstResponder]; 
    textView.autocorrectionType = UITextAutocorrectionTypeNo; 
    [textView becomeFirstResponder]; 
    

    }否则如果([文字isEqualToString:@”“]!& & textView.autocorrectionType = UIT extAutocorrectionTypeYes){

    // empty space so we reenable autocorrect 
    [self.hiddenTextView becomeFirstResponder]; 
    textView.autocorrectionType = UITextAutocorrectionTypeYes; 
    [textView becomeFirstResponder]; 
    

    }

    返回YES; }

+1

这里的建议可能有效:http://stackoverflow.com/a/8656965/2274694 – 2014-12-04 23:34:15

+1

实际上,我想我找到了更好的答案......一秒钟。 – 2014-12-04 23:35:39

回答

4

我发现了一个伟大的答案by Engin Kurutepe如何正确触发自动更正。

该解决方案是非常简单的,但没有记录:您只能更改 在UITextInputTraits协议中定义的属性,而 UITextView的问题是不是第一个响应者。

在这种情况下可以尝试

所以:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range 
replacementText:(NSString *)text 
{ 

    if ([text isEqualToString:@"@"]) { 

     // text starts with "@" so we disable autocorrect 
     [textView resignFirstResponder]; 
     textView.autocorrectionType = UITextAutocorrectionTypeNo; 
     [textView becomeFirstResponder]; 

    } else if ([text isEqualToString:@" "]) { 

     // empty space so we reenable autocorrect 
     [textView resignFirstResponder]; 
     textView.autocorrectionType = UITextAutocorrectionTypeYes; 
     [textView becomeFirstResponder]; 
    } 

    return YES; 
} 

编辑:

虽然该解决方案无疑是一个有点“黑客”如您在评论中指出,推理恩金提供不是,它可能是合法的,即使它没有正确记录。因此,如果事实上的确如此:“您只能更改UITextInputTraits协议中定义的属性,而UITextView不是第一响应者”,那么您可能会被迫使用类似于代码的“黑客”我已经发布;在这种情况下,您还可以编辑基于接收到的键盘通知来移动工具栏的方法,以便在自动更正处于中间切换时您的工具栏不会移动。也许可以尝试使用像“midToggle”这样的bool,并在resignFirstResponderbecomeFirstResponder,shouldChangeTextInRange之前设置/取消设置,以便工具栏知道在这些时刻保持静止。

+0

感谢Lyndsey的回答。然而,这确实起作用,它不仅仅是修补程序,而更像是一种破解。原因是因为它会导致键盘上方的工具栏(文本视图的inputAccessoryView)在resignFirstResponder和BecomeFirstResponder被调用时反弹。如果我不需要工具栏在键盘上保持静止,那么它就没问题。 – DJSK 2014-12-05 00:03:28

+1

@DJSK编码解决方案是一种破解,但他提供的理由不是,也可能是合法的,即使它没有记录。如果事实上的确如此:“你只能改变在UITextInputTraits协议中定义的属性,而UITextView不是第一响应者”,那么也许你必须使用类似于我发布的代码,但是编辑方法如果自动更正是在中间切换,则移动工具栏以使*不移动工具栏。也许你必须使用像“midToggle”这样的'bool',并在'shouldChangeTextInRange'中设置/取消设置。 – 2014-12-05 00:45:08

+0

谢谢林德西。感谢您的帮助,我得到了它的工作。如果您需要,我会回复。 – DJSK 2014-12-05 02:51:00

3

得到它的工作。最好的解决方案似乎是将您的响应者更改为隐藏的另一个文本视图,设置原始文本视图autocorrectType属性,然后重新分配原始文本视图作为第一响应者。这是一个小黑客,但它的作品,并不会导致键盘跳。此外,检查textViews的当前autocorrectionType属性以防止冗余的响应者分配也很重要。非常感谢Lyndsey帮助我找到答案。

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range 
replacementText:(NSString *)text 
{ 
    if ([text isEqualToString:@"@"] && 
     textView.autocorrectionType != UITextAutocorrectionTypeNo) { 

     // text starts with "@" so we disable autocorrect 
     [self.hiddenTextView becomeFirstResponder]; 
     textView.autocorrectionType = UITextAutocorrectionTypeNo; 
     [textView becomeFirstResponder]; 

    } else if ([text isEqualToString:@" "] && 
       textView.autocorrectionType != UITextAutocorrectionTypeYes) { 

     // empty space so we reenable autocorrect 
     [self.hiddenTextView becomeFirstResponder]; 
     textView.autocorrectionType = UITextAutocorrectionTypeYes; 
     [textView becomeFirstResponder]; 
    } 

    return YES; 
} 
0

解决此问题的方法不太方便,即检查输入的字符串是否是您选择的字符串。您可以设置一个变量来保存您在didSelectRowInIndexPath中选择的字符串。然后,在textView的委托方法shouldChangeTextInRange中检查replacementText是否与您在didSelectRowAtIndexPath中选择的字符串匹配。如果不匹配,则返回false。

相关问题