2012-03-18 98 views
2

我想要一个'$'登录无法擦除的文本字段。用户应该能够在后面输入值,如果他按下退格键,则只应该删除他输入的值。向UITextField添加前缀

之所以我不能使用UILabel是因为UITextfield中的文本是居中对齐的,并且随着用户输入值而增长到任何一边。

请提供任何解决方案

+0

你看过委托方法吗?特别是: - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)范围replacementString:(NSString *)string' – CodaFi 2012-03-18 06:21:59

回答

8
  1. 设置文本字段的文本,以“$”开始。
  2. 将文本字段的委托设置为您的某个对象(可能是包含它的视图控制器)。如果建议的更改将删除“$”,则返回NO

此外,您可能需要实施-textFieldDidBeginEditing:将光标放置在“$”之后,如果它尚未存在。

0

正如在以前的答案Add a prefix to UITextField

textFieldDidBeginEditing内的委托方法我用下面的代码发现是格式化字符串我们前/后固定货币符号最佳和正确的方式指出/码

 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

不需要使用shouldChangeCharactersInRange委托方法。最简单,最方便的解决方案是这样的

  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

你也可以继承UITextField为其取量值中的所有文本字段。

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

这将插入每当进入第一号的$标志,并删除它时,所有的号码都删除。

var amount将在删除$符号后给出用户输入的实际金额值。

希望这有助于。