Swift 3:在编辑更改时附加到UITextField

时间:2017-01-11 04:22:20

标签: ios iphone swift uitextfield

虽然没有为Swift 3更新答案,但可能很简单。

如何在编辑文本字段时将字符附加到UITextField?在编辑结束后用户不键入时,应附加字符。

例如:

User types: 1
Field Updates: 1 kg

User types 123
Field Updates: 123 kg

尝试使用EditingChanged IBActions解决这个问题但是如何阻止值为每个键入的新字符附加“kg”?

Example "1 kg 2 kg 3 kg" 

4 个答案:

答案 0 :(得分:4)

尝试这种方式可能会帮助你。

  1. 为正在编辑的文字添加文本字段的目标

    textField.addTarget(self, action: #selector(self.textFieldDidChange), for: .editingChanged)
    
  2. 在Observer方法中尝试以下方式

    func textFieldDidChange(textfield: UITextField) {
    
        var text = textField.text?.replacingOccurrences(of: " KG", with: "")
        text = text! + " KG"
        textField.text = text
    
        print("Text changed")
    }
    

答案 1 :(得分:2)

您需要UITextFieldDelegate方法

var response = result['s:Envelope']['s:Body'][0].OrderReportResponse[0].obj[0];
            var marketOrder = response['a:MarketOrder'];
            // Storing values in Dictionary
            var dict1 = [];
            var dict2 = [];
            for (var i = 0; i < marketOrder.length; i++) {
                var keys1 = []; // Storing multiple keys in 1 object
                var keys = [];
                // if (dict1.length === 0) {
                keys.push({
                    k1: marketOrder[i]['a:SecurityExchange'],
                    k2: marketOrder[i]['a:Symbol'],
                    k3: marketOrder[i]['a:MaturityMonthYear']
                });
                if (keys1.indexOf(keys[0].k1) && keys1.indexOf(keys[0].k2) && keys1.indexOf(keys[0].k3)) {
                    keys1.push(keys[0].k1, keys[0].k2, keys[0].k3);
                }
                for (var k1 in keys1[0]) {
                    var dict = {};
                    dict[keys1] = marketOrder[i];
                    if (dict1.indexOf(dict)) {
                        dict1.push(dict);
                    }
                }
            }
 var targetObj = [];
            var targetObj1 = [];
            for (var i = 0; i < dict1.length; i++) {
                for (var key in dict1[i]) {

                    if (!targetObj.hasOwnProperty(key)) {
                        targetObj[key]= 0;
                        //targetObj1.push(targetObj);
                    }
   targetObj[key] += (dict1[i][key]);
}}
  console.log(targetObj);

我应该警告你,由于Swift处理字符串的方式,这实现了令人难以置信的烦恼。通常最好只将文本转换为NSString(这是UTF16)并处理范围。但是,如果您只是在做数字并且可以使用固定的小数位,则情况更容易处理。保留一个代表您的“实数”的自定义数字,然后更新该字段以反映您的格式化数字。由于您只允许数字,因此有许多情况需要处理(此代码不会处理复制/粘贴)。

您必须在故事板中设置文本字段委托和键盘(为数字)。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool

答案 2 :(得分:0)

使用UITextFieldDelegate's功能:

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool // return NO to not change text

您必须使用range参数组合来自此函数的textfield.text和string参数中的文本,以便在您根据范围键入/粘贴/清除时获取文本字段上的字符串。

跟踪range.length,因为它总是给出删除/清除字符串的计数,当你输入文本时它是0。 range.location给出了编辑的位置。

然后你可以将形成的字符串设置为textfield.text并返回false 记住 - 返回false而不是true

答案 3 :(得分:0)

将文本字段委托与控制器相符并尝试此解决方案。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if string == "" {
        // handle backspace scenario here
      return true
    } else if var textString = textField.text {
        let unitString = "kg"
        if textString.contains(unitString) {
            textString = textString.replacingOccurrences(of: unitString, with: "")
            textString += string + unitString
            textField.text = textString
        } else {
            textField.text = string + unitString
        }
        return false
    }
    return true
}