2016-01-21 84 views
1

我有一個UITextView的空白測試應用程序,我已經添加了這個委託方法:在文本的開始更新的UITextView autocapitalizationType動態

func textViewDidChange(textView: UITextView) { 
    if textView.text.hasPrefix("Cap") { 
     textView.autocapitalizationType = .AllCharacters 
    } else { 
     textView.autocapitalizationType = .Sentences 
    } 
} 

如果用戶鍵入「帽」,我希望textView更改爲.AllCharacters的autocapitalizationType。如果他們刪除該前綴,它應該變回句子。

該代碼被調用但沒有兌現和鍵盤不會改變,以反映這一點。任何想法如何我可以推動textView更新大寫?

回答

2

非常有趣的問題。事實上,autocapitalizationType不會改變,而鍵盤是存在的,但你可以通過辭職,並使其再次成爲第一個響應輕移它:

textView.autocapitalizationType = .AllCharacters 
// slow operation 
textView.resignFirstResponder() 
textView.becomeFirstResponder() 

問題是這樣的過程是緩慢的,所以你會覺得每個角色之間有很大的延遲,所以你應該做一次這個操作。

func textViewDidChange(textView: UITextView) { 
    if textView.text.hasPrefix("Cap") { 
     if textView.autocapitalizationType != .AllCharacters { 
      textView.autocapitalizationType = .AllCharacters 
      textView.resignFirstResponder() 
      textView.becomeFirstResponder() 
     } 
    } else { 
     textView.autocapitalizationType = .Sentences 
    } 
} 

我希望有幫助。

+0

這確實有效,但不幸的是,對於製作應用程序來說並不是真的可行,因爲它很慢且很昂貴。我認爲這可能是我唯一的選擇,所以如果我沒有得到任何其他答案,我會將其標記爲正確的。謝謝! – ntesler

+0

即使第二種方法對於@ntesler來說也很慢?我在這裏測試過了,因爲它沒有觸發辭職/當大寫字母類型已經是'.AllCharacters'時成爲第一響應者。 –

+0

絕對是一種改進。我有很多在textViewDidBegin/EndEditing中執行的代碼,但是當我使用此解決方法時,我可以阻止它執行,這應該有所幫助。我會再次檢查一下Instrument,當調用這個函數時,系統不會做太多的代價。 – ntesler