Agregar un prefijo a UITextField

Quiero un signo de "$" en el campo de text que no se puede borrar. Un usuario debería poder ingresar valores después de él y si presiona retroceder, solo debería borrar el valor que ingresó.

La razón por la que no puedo usar UILabel antes es porque el text en UITextfield está alineado en el centro y crece a cada lado cuando el usuario ingresa valores.

Proporcione cualquier solución

  1. Establezca el text del campo de text en "$" inicialmente.
  2. Establezca el delegado del campo de text en algún object suyo (probablemente el controller de vista que lo contiene).
  3. Implementar -textField:shouldChangeCharactersInRange:replacementString: y devolver NO si el cambio propuesto eliminara el "$".

Además, es posible que necesite implementar -textFieldDidBeginEditing: para colocar el cursor después del "$" si no está allí.

No es necesario utilizar el método de delegado shouldChangeCharactersInRange . La solución más fácil y más conveniente es esta

  var label = UILabel(frame: CGRectMake(0, 0, 50, 50)) label.text = "$"; label.backgroundColor = UIColor(white: 0.0, alpha: 0.0) tenantField.rightViewMode = .Always tenantField.rightView = label 

Como se indicó en la respuesta anterior, agregue un prefijo a UITextField

dentro del método textFieldDidBeginEditing como delegado encontré usando el siguiente código para ser el mejor y correcto para formatear una cadena. Estamos pre / post arreglando símbolos / códigos de moneda

  NSNumberFormatter* formatter = [[NSNumberFormatter alloc]init]; [formatter setNumberStyle:NSNumberFormatterCurrencyStyle]; [formatter setPaddingPosition:NSNumberFormatterPadAfterPrefix]; [formatter setCurrencySymbol:symbol]; [formatter setMaximumFractionDigits:2]; [formatter setMinimumFractionDigits:2]; [formatter setUsesGroupingSeparator:YES]; [formatter setCurrencyGroupingSeparator:@","]; [formatter setCurrencyDecimalSeparator:@"."]; 

Puede subclass UITextField para todo el campo de text que toma la cantidad como valor.

 class SpecialTextField: UITextField { var amount: String { get { if self._amount.characters.count > 1 { return (self._amount as NSString).substringFromIndex(2) } return "" } } // MARK: - UITextField Observing override internal func willMoveToSuperview(newSuperview: UIView!) { if newSuperview != nil { keyboardType = .DecimalPad addTarget(self, action: #selector(SpecialTextField.didChangeText), forControlEvents: .EditingChanged) } } override internal func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool { return false } private var newVal: String = "" private var _amount: String = "" func didChangeText() { if (text?.characters.count > 2) { if text?.rangeOfString("$ ") == nil { text = newVal } } if (text?.characters.count == 1) && (text?.characters.count > newVal.characters.count) { text = "$ " + text! } if (text?.characters.count == 2) && (text?.characters.count < newVal.characters.count) { text = "" } newVal = text ?? "" _amount = newVal } } 

Esto insertá un signo de $ cada vez que se ingrese el primer número, y lo eliminará siempre que se eliminen todos los numbers.

var amount dará el valor real del importe ingresado por el usuario, luego de eliminar el signo $ .

Espero que esto haya ayudado.