2017-09-26 60 views
0

我可以根據我在文本字段中輸入的內容,使用以下代碼行來改變我在文本字段中顯示數字的方式。但是我甚至無法在我的代碼的第二個版本中輸入數字。爲什麼replaceCharacters更改文本字段中的文本所必需的?

爲什麼

[let oldText = textField.text! as NSString 
var newText = oldText.replacingCharacters(in: range, with: string)] 

是必要的嗎?

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 

    let oldText = textField.text! as NSString 
    var newText = oldText.replacingCharacters(in: range, with: string) 

    var newTextString = String(newText) 

    let digits = CharacterSet.decimalDigits 
    var digitText = "" 
    for c in (newTextString?.unicodeScalars)! { 
     if digits.contains(UnicodeScalar(c.value)!) { 
      digitText.append("\(c)") 
     } 
    } 

    // Format the new string 
    if let numOfPennies = Int(digitText) { 
     newText = "$" + self.dollarStringFromInt(numOfPennies) + "." + self.centsStringFromInt(numOfPennies) 
    } else { 
     newText = "$0.00" 
    } 

    textField.text = newText 

    return false 
} 

func textFieldDidBeginEditing(_ textField: UITextField) { 
    if textField.text!.isEmpty { 
     textField.text = "$0.00" 
    } 
} 

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textField.resignFirstResponder() 

    return true; 
} 

func dollarStringFromInt(_ value: Int) -> String { 
    return String(value/100) 
} 

func centsStringFromInt(_ value: Int) -> String { 

    let cents = value % 100 
    var centsString = String(cents) 

    if cents < 10 { 
     centsString = "0" + centsString 
    } 

    return centsString 
} 

如果我像這樣改變它,它不再工作。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 

    var newText = textField.text 


    let digits = CharacterSet.decimalDigits 
    var digitText = "" 
    for c in (newText?.unicodeScalars)! { 
     if digits.contains(UnicodeScalar(c.value)!) { 
      digitText.append("\(c)") 
     } 
    } 

    // Format the new string 
    if let numOfPennies = Int(digitText) { 
     newText = "$" + self.dollarStringFromInt(numOfPennies) + "." + self.centsStringFromInt(numOfPennies) 
    } else { 
     newText = "$0.00" 
    } 

    textField.text = newText 

    return false 
} 

回答

0

textField(_:shouldChangeCharactersIn:replacementString:)被稱爲之前的文本替換文本字段中的。此方法用於獲取新文本,然後用textField.text訪問。

如果您只是想在更換髮生後運行邏輯,請注意名爲.UITextFieldTextDidChange的通知。

NotificationCenter.default.addObserver(self, selector: #selector(textFieldTextDidChange), name: .UITextFieldTextDidChange, object: textField) 

func textFieldTextDidChange() { 
    print(textField.text) 
} 
0

「shouldChangeCharactersIn」在文本字段被修改之前調用。由於您的代碼總是返回false,因此無論用戶輸入(或粘貼)的內容都不會更新該字段的內容,除非您自己做。

在第二個版本中,您完全忽略了用戶的輸入,所以您的字段值永遠不會改變。

0

讓我們一部分回答。

1)方法replacingCharacters(in: range, with: string)不是必需的。此方法將替換與指定範圍匹配的子字符串。因此,與蘋果文檔根據:

stringByReplacingCharactersInRange:withString:

返回其在接收器的指定範圍內的字符由給定的字符串替換一個新的字符串

2)代碼更改無效的真正原因是返回值false。嘗試返回true並且更改將會起作用。無論何時設置文本字段text屬性,方法textField:shouldChangeCharactersIn:replacementString:都將被調用(因爲它的委託被分配)。返回false你告訴程序它不應該替換字符。

UPDATE

嘗試使用UIControl事件Value Changed作爲@IBAction代替textField:shouldChangeCharactersIn:replacementString:這將很好地工作。

觀測數據:對不起,我的英語

+0

如果shouldChangeCharactersIn方法直接更新文本字段的文本,那麼它必須返回false。 – rmaddy

+0

@rmaddy謝謝你有什麼想法爲什麼第一個版本使用.replacingCharacters方法來改變文本?我的意思是有很多方法可以在不使用額外的行的情況下更改文本字段中的文本。使用它有什麼好處嗎? –

+0

@willianPoliciano謝謝!在改變返回值後,它適用於第二個版本。但仍然有一個問題,看看你能否幫助我。我在回覆rmaddy時解決了這個問題 –

相關問題