2014-10-21 28 views
7

iOS8'in tahmini-girişi, UITextView aşağıdaki temsilci yöntemini birden çok kez çağırır; bu, seçilen sözcüğün, görünüme birden çok kez eklenmesiyle sonuçlanır.Neden tahmin girişini kullanarak birden çok kez aramalı?

Bu kod, tekli harfler ve kopyalama/yapıştırma için çalışır, ancak giriş-çıkış çubuğunu kullanırken değil; neden olmasın?

- (BOOL) textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text 
{ 
    textView.text = [textView.text stringByReplacingCharactersInRange:range withString:text]; 
    return false; 
} 

Bu kodla; boş bir UITextView girer ve tahmin metninde (otomatik tamamlama) "The" üzerine basarsanız, bu yöntemde üç arama yaparak görüntüye "The The" öğesini ekler. Her arama için geçirilen parametreler şunlardır:

  • aralığı: {0,0} metin: @"The"
  • aralığı: {0,0} metin: @"The"
  • aralığı: {3,0} metin: @" "

anlayabilirim uzay ; ama neden "The" iki kere eklediniz?

cevap

11

Bu aynı sorunu yaşıyorum. Tahmine dayalı metinde, bu temsilci yönteminde textView.text öğesinin ayarlanması, söz konusu temsilci yöntemine bir aniden çağrıyı tetikler (bu yalnızca bildiğim kadarıyla tahmini metinle olur).

Ben sadece bir bekçi ile benim TextView'un değişiklikleri çevreleyen tarafından düzelttim:

JLust yorumunda belirtildiği gibi, boşluk o 3 çağrı uzatacağını, çünkü Richard Venable kabul cevabı modifiye
private var hack_shouldIgnorePredictiveInput = false 

func textView(textView: UITextView!, shouldChangeTextInRange range: NSRange, replacementText text: String!) -> Bool { 
    if hack_shouldIgnorePredictiveInput { 
     hack_shouldIgnorePredictiveInput = false 
     return false 
    } 

    hack_shouldIgnorePredictiveInput = true 

    textView.text = "" // Modify text however you need. This will cause shouldChangeTextInRange to be called again, but it will be ignored thanks to hack_shouldIgnorePredictiveInput 

    hack_shouldIgnorePredictiveInput = false 

    return false 
} 
+0

Ben de bunu keşfettim ve sonunda aynı şeyi yaptım. – Wex

+0

@ "" sağlayan 3. çağrı, ilk shouldChangeTextInRange: post iadesi yapıldıktan sonra hack_shouldIgnorePredictiveInput basitçe false döndürüp, boş alan gönderilmeden önce engelleme bayrağı false geri döner. – JLust

0

beni kapalı

Ben

private var predictiveTextWatcher = 0 

Ve

if predictiveTextWatcher == 1 { 
      predictiveTextWatcher = 0 
      return false 
     } 

     if hack_shouldIgnorePredictiveInput { 
      predictiveTextWatcher += 1 
      hack_shouldIgnorePredictiveInput = false 
      return false 
     } 

Her şey oldukça hacky, ama hiç yoktan iyidir ekledi.

En iyi,

İlgili konular