我如何编程方式关闭在一个UITextView自动更正酥料饼?(How can I programma

2019-06-27 15:17发布

我在做一些自定义的自动完成的东西对我自己的insertText:但如果有一个自动更正建议可见视图进入一个奇怪的状态。

如果我使用[textView unmarkText]解聘自动更正弹出啄-但它接受自动校正(这是坏的)。 有没有一些方法以编程方式拒绝自动更正建议吗?

我目前的“解决方案”的作品,但它的毛利率和哈克,我也没有理由认为它会继续在今后的工作。 有一个更好的方法吗?

- (void)dismissAutocorrectSuggestionForTextView:(UITextView *)textView {
    NSRange range = textView.selectedRange;
    textView.text = textView.text;
    textView.selectedRange = range;
}

Answer 1:

我想你类似的东西,但设置TextView的文本这样导致的TextView不必要的滚动(我的TextView包含相当多的文字)。 我的解决方案涉及恢复contentOffset在非动画方式。 这不正是任何比你有什么更优雅,但它至少可以帮助那些谁需要处理较长的文本。

至于是否它会继续在今后的工作中,我已经试过这样的事情,因为iOS 4的,并继续通过iOS 6的工作。

- (void)rejectAutoCorrectSuggestionInTextView:(UITextView *)textView
{
    if ([textView isFirstResponder])
    {
        NSString *original = textView.text;
        NSRange originalRange = textView.selectedRange;
        CGPoint originalOffset = textView.contentOffset;

        // Force any pending autocorrection to be applied
        [textView resignFirstResponder];
        [textView becomeFirstResponder];

        NSString *final = textView.text;

        if (![original isEqualToString:final])
        {
            textView.text = original;
            textView.selectedRange = originalRange;
            [textView setContentOffset:originalOffset animated:NO];
        }
    }
}


Answer 2:

我正好遇到这个问题我自己。 该解决方案能够工作:

[textView.inputDelegate textWillChange:textView];
[textView.inputDelegate textDidChange:textView];


Answer 3:

你原来的解决方案是密切。 尝试以下方法:

- (void)dismissAutocorrectSuggestionForTextView:(UITextView *)textView {
    NSRange rangeCopy = textView.selectedRange;
    NSString *textCopy = textView.text.copy;
    [textView resignFirstResponder];
    [textView becomeFirstResponder];
    [textView setText:textCopy];
    [textView setSelectedRange:rangeCopy];
}

调用辞职/成为第一个响应背靠背导致文本视图立即接受挂起的自动更正,但没有真正驳回键盘(试试吧,你会感到吃惊)。 这适用于iOS 6和iOS 7的肯定。 接受自动更正后,然后重置文本和选择的范围之前自动更正所以然来。



Answer 4:

如果从文本视图辞职第一响应者是不需要的,你可以将作为代表到文本视图,你可以实现方法

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

return NO在特定的情况下。 例如,你可以尝试以下方法:

@implementation
{
    BOOL _denyReplacements;
}

//////////////

- (void)dismissAutocorrectSuggestionForTextView:(UITextView *)textView {
    NSRange rangeCopy = textView.selectedRange;
    NSRange fakeRange = rangeCopy;
    fakeRange.location--;
    _denyReplacements = YES;
    [textView unmarkText];
    [textView setSelectedRange:fakeRange];
    [textView setSelectedRange:rangeCopy];
    _denyReplacements = NO;
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
     return !_denyReplacements;
}

当文本视图选择的变化,自动完成试图接受当前建议,但文本视图协商作出更换之前调用此方法。 为什么你会做的,而不是仅仅辞职/成为第一个响应此的一个例子是,当你有一些逻辑textViewDidBeginEditing和/或textViewDidEndEditing方法,例如,你不想当您关闭自动更正进行。



文章来源: How can I programmatically dismiss the autocorrect popover in a UITextView?