![](/img/trans.png)
[英]How can I programmatically dismiss/disable the screenshot popover that was introduced in iOS 11?
[英]How can I programmatically dismiss the autocorrect popover in a UITextView?
我正在用insertText:
自己做一些自定義自動完成的東西,但是如果有自動insertText:
的建議可見,則視圖將進入怪異狀態。
如果我使用[textView unmarkText]
,它將自動[textView unmarkText]
彈出的東西-但它接受自動[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
方法中有一些邏輯時,為什么不執行此操作而不僅僅是辭職/成為第一響應者,例如,您不想在取消自動更正時執行這些邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.