2014-12-04 67 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。

相關問題