【问题标题】:Add a prefix to UITextField为 UITextField 添加前缀
【发布时间】:2012-04-03 03:05:23
【问题描述】:

我想在文本字段中添加一个无法删除的“$”符号。用户应该能够在它之后输入值,如果他按下退格键,它应该只会删除他输入的值。

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

请提供任何解决方案。

【问题讨论】:

  • 你看过委托方法吗?具体来说:- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

标签: objective-c ios nsstring uitextfield


【解决方案1】:
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")
}

【讨论】:

    【解决方案2】:

    您可以为所有以金额为值的文本字段子类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 将给出用户输入的实际金额值,删除 $ 符号后。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      无需使用 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
      

      【讨论】:

        【解决方案4】:

        如上一个答案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:@"."];
        

        【讨论】:

          【解决方案5】:
          1. 最初将文本字段的文本设置为“$”。
          2. 将文本字段的委托设置为您的某个对象(可能是包含它的视图控制器)。
          3. 实施-textField:shouldChangeCharactersInRange:replacementString: 并返回NO,如果提议的更改会删除“$”。

          此外,如果“$”不存在,您可能需要实现 -textFieldDidBeginEditing: 将光标定位在“$”之后。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-12-07
            • 2018-12-12
            • 2018-08-19
            • 2018-10-03
            • 2013-01-30
            • 1970-01-01
            • 2018-11-01
            相关资源
            最近更新 更多