为UITextField添加前缀

时间:2012-03-18 06:17:04

标签: objective-c ios nsstring uitextfield

我想要一个'$'登录文本字段,无法删除。用户应该能够在其后输入值,如果他按下退格键,它应该只删除他输入的值。

之前我不能使用UILabel的原因是因为UITextfield中的文本是居中对齐的,当用户输入值时它会增长到任意一侧。

请提供任何解决方案

5 个答案:

答案 0 :(得分:8)

  1. 最初将文本字段的文本设置为“$”。
  2. 将文本字段的委托设置为您的某个对象(可能是包含它的视图控制器)。
  3. 如果建议的更改会删除“$”,请实施-textField:shouldChangeCharactersInRange:replacementString:并返回NO
  4. 此外,您可能需要实现-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")
}