2012-03-18 2 views
2

Je veux un «$» Inscrivez-vous dans le champ de texte qui ne peut pas être effacé. Un utilisateur devrait pouvoir entrer des valeurs après lui et s'il appuie sur le retour arrière, il ne devrait effacer que la valeur qu'il a saisie.Ajouter un préfixe à UITextField

La raison pour laquelle je ne peux pas utiliser UILabel avant c'est parce que le texte dans UITextfield est aligné au centre et il croît de chaque côté lorsque l'utilisateur entre des valeurs.

S'il vous plaît fournir une solution

+0

Avez-vous jeté un coup d'œil aux méthodes des délégués? plus précisément: '- (BOOL) textField: (UITextField *) textField shouldChangeCharactersInRange: (NSRange) plage chaîneChange: (NSString *) chaîne' – CodaFi

Répondre

8
  1. Set à "$" d'abord le texte du champ de texte.
  2. Définissez le délégué du champ de texte sur un de vos objets (probablement le contrôleur de vue qui le contient).
  3. Mettre en œuvre -textField:shouldChangeCharactersInRange:replacementString: et renvoyer NO si la modification proposée supprimait le "$".

De même, vous devrez peut-être implémenter -textFieldDidBeginEditing: pour positionner le curseur après le "$" s'il n'y est pas déjà.

0

Comme indiqué dans la réponse précédente Add a prefix to UITextField

à l'intérieur du textFieldDidBeginEditing comme méthode déléguée je l'ai trouvé en utilisant le code suivant pour être le meilleur et bonne façon de formater la chaîne, nous sommes avant/après la fixation des symboles monétaires/codes

 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:@"."]; 
1

Inutile d'utiliser la méthode shouldChangeCharactersInRange. Le plus simple et la solution la plus pratique est ce

  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 
0

Vous pouvez sous-classe UITextField pour tout le champ de texte qui prennent quantité en tant que valeur.

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 
} 
} 

Ceci va insérer un signe $ chaque fois premier numéro est entré, et supprime chaque fois que tous les numéros sont supprimés.

var amount donnera la valeur réelle que l'utilisateur a saisie, après avoir supprimé le signe $.

J'espère que cela a aidé.

Questions connexes