View Controller class
@IBOutlet weak var priceTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
priceTextField.becomeFirstResponder()
priceTextField.delegate = self
}
UITextFieldDelegate (extension)
-
return
시, 키보드 내리기 & cursor 비활성화
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
textField.tintColor = UIColor.clear
return true
}
- textfield 터치 시, cursor 활성화
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
priceTextField.tintColor = .gray
return true
}
- textfield 내 formatting (가격 형태)

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let formatter = NumberFormatter()
formatter.usesGroupingSeparator = true
formatter.numberStyle = NumberFormatter.Style.decimal
formatter.maximumFractionDigits = 0
formatter.decimalSeparator = "." // Adapt to your case
formatter.groupingSeparator = "," // Adapt to your case
// The complete string if string were added at the end
// Here we only insert figures at the end
// Let us first remove extra groupingSeparator we may have introduced to find the number
let completeString = textField.text!.replacingOccurrences(of: formatter.groupingSeparator, with: "") + string
var backSpace = false
if let char = string.cString(using: String.Encoding.utf8) {
let isBackSpace = strcmp(char, "\\b")
if (isBackSpace == -92) {
backSpace = true
}
}
if string == "" && backSpace { // backspace inserts nothing, but we need to accept it.
return true
}
if string == "-" && textField.text! == "" { // Accept leading minus
return true
}
guard let value = Double(completeString) else { return false } // No double ; We do not insert
let formattedNumber = formatter.string(from: NSNumber(value: value)) ?? ""
textField.text = formattedNumber // We update the textField, adding typed character
return string == formatter.decimalSeparator // No need to insert the typed char: we've done just above, unless we just typed separator
}
참고자료