2015-04-02 38 views
-1

所以我成功地實施瞭解決限制的UITextField的大小在以下鏈接Max length UITextField 不過,我不明白爲什麼你必須使用需要的UITextField最大長度執行的解釋

var newLength = countElements(textField.text) + countElements(string) - range.length 
return !(newLength > 5) 

,而不是我最初的解決方案的

var newLength = countElements(textField.text) 
return !(newLength > 4) 

這兩種解決方案限制了字符串的大小在5個的UITextField數字,但第一溶液允許用戶使用退格刪除字符,但第二溶液(米y初始解決方案)不允許用戶使用退格刪除字符。有人可以解釋一下嗎?

+0

如果這個問題包含了代碼所在的上下文,那將會非常有幫助。你是從哪裏回來的? – nhgrif 2015-04-02 01:34:12

+0

這是一項任務,我使用的文本字段應僅限於5位數字(一個郵政編碼),它更像是使用代表的一課,但我更願意瞭解一種可用的方案(能夠糾正您的錯字)而不僅僅是知道如何設置委託 – 2015-04-02 15:07:12

+0

是的,但是**這種邏輯被應用於哪個委託方法與解釋場景至關重要。這就是說,我認爲我的回答充分解釋了它基於這個邏輯所在的委託方法的假設。 – nhgrif 2015-04-02 15:10:10

回答

2

假設問題的片斷來自這個UITextFieldDelegate方法提取:當你意識到,蘋果試圖使它們的方法名稱純英語可讀

textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool 

的問題變得很清楚。此方法稱爲應更改字符。方法名稱的動詞時態意味着此方法在之前被稱爲文本字段的字符被更改。它會返回一個Bool。它問我們是否應該改變角色。

重要的是,這意味着無論textField.text是什麼,它都沒有考慮到用戶正在嘗試做出的改變。同樣重要的是,當用戶按下刪除/退格鍵以及用戶選擇了一系列文本並粘貼新內容時,會調用此方法。

那麼,爲什麼您的第二個方法在某些情況下會失敗場景?

你的目標是確保最大長度是一定數量的字符,對嗎?如果我們按下退格鍵,我們的委託方法將被調用,範圍的最後一個索引和長度爲1(我們刪除最後一個字符),string參數將是一個emptry字符串:""。如果我們返回true,則字符串的長度將縮短一個字符。

但請記住,textField.text仍然保持與用戶在此時按下按鈕之前所做的相同的值。您的方法將查看長度,請參閱該字符串已處於最大長度,並禁止所有更改,因爲您的方法假定對shouldChangeCharactersInRange的任何調用意味着長度增加,但事實並非如此。

的另一種方法計算什麼長度如果我們回到true這種方法和基於計算,適當地返回true或false。

有效地,range變量的length部分是字符用戶從textField.text去除的數量,和string變量的length一部分字符用戶被添加到textField.text的數量。

+0

這太棒了,謝謝!我認爲最大的啓示是'textField.text'不是在UI中的文本窗口中呈現的,它是在用戶要求向UI輸入另一個字符之前呈現的字符串。有些'println()'消息顯示了這一點(例如,'countElements(textField.text)'不會因爲您在輸入或移除字符之前輸入到UI的前一次輸出計數而返回空格而不更改值,因此Bool不能變回「真」以允許改變) – 2015-04-02 15:25:41

0

你有很多escenarios考慮,例如,你可以選擇一個文本範圍,然後替換它的許多人物,甚至沒有,這就是爲什麼你需要評估:

  1. 字符的文本字段
  2. 將被添加到文本字段的字符(可以是多個字符,可以粘貼剪貼板中的內容)
  3. 減去要替換的字符(所選文本)。

希望這會有所幫助。