我想要一个'$'登录文本字段,无法删除。用户应该能够在其后输入值,如果他按下退格键,它应该只删除他输入的值。
之前我不能使用UILabel的原因是因为UITextfield中的文本是居中对齐的,当用户输入值时它会增长到任意一侧。
请提供任何解决方案
答案 0 :(得分:8)
-textField:shouldChangeCharactersInRange:replacementString:
并返回NO
。此外,您可能需要实现-textFieldDidBeginEditing:
将光标定位在“$”之后(如果它已经不存在)。
答案 1 :(得分: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
答案 2 :(得分: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:@"."];
答案 3 :(得分: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
符号后, $
会提供用户输入的实际金额值。
希望这会有所帮助。
答案 4 :(得分:0)
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let updatedText = textField.text!.replacingCharacters(in: Range(range, in: textField.text!)!, with: string)
return updatedText.hasPrefix("yourprefixhere")
}