我在做一些自定义的自动完成的东西对我自己的insertText:
但如果有一个自动更正建议可见视图进入一个奇怪的状态。
如果我使用[textView unmarkText]
解聘自动更正弹出啄-但它接受自动校正(这是坏的)。 有没有一些方法以编程方式拒绝自动更正建议吗?
我目前的“解决方案”的作品,但它的毛利率和哈克,我也没有理由认为它会继续在今后的工作。 有一个更好的方法吗?
- (void)dismissAutocorrectSuggestionForTextView:(UITextView *)textView {
NSRange range = textView.selectedRange;
textView.text = textView.text;
textView.selectedRange = range;
}
我想你类似的东西,但设置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];
}
}
}
我正好遇到这个问题我自己。 该解决方案能够工作:
[textView.inputDelegate textWillChange:textView];
[textView.inputDelegate textDidChange:textView];
你原来的解决方案是密切。 尝试以下方法:
- (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的肯定。 接受自动更正后,然后重置文本和选择的范围之前自动更正所以然来。
如果从文本视图辞职第一响应者是不需要的,你可以将作为代表到文本视图,你可以实现方法
- (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?