Swift:当其他textField被填充时,如何自动更改textField文本?

时间:2015-11-12 14:24:14

标签: ios swift uitextfield

我实现了两个UITextFields的自定义单元格。无论何时我填写其中一个文本字段,我希望对方在填充转换后的值时作出反应。

尝试didSet方法,但似乎不是解决方案

示例:

import UIKit

class ConverterTableViewCell: UITableViewCell, UITextFieldDelegate {

@IBOutlet weak var mgdlTextField: UITextField! {
    didSet
    {
        if let value = Double(mgdlTextField.text!){
            let newValue:Double = value / 38.6
            self.mmolTextField.text = "\(newValue)"
        }

    }
}

@IBOutlet weak var label: UILabel!
@IBOutlet weak var mmolTextField: UITextField!
override func awakeFromNib() {
    super.awakeFromNib()
    self.mgdlTextField.delegate = self

    self.mmolTextField.delegate = self

}

编辑: 我在下面的答案中尝试了代码并最终得到了这个错误:

enter image description here

1 个答案:

答案 0 :(得分:4)

didSet不是解决方案,因为当您使用新的UITextField实例分配mgdlTextField变量时它会做出反应。

相反,您必须将视图控制器注册为文本字段的委托,并实现以下UITextFieldDelegate方法:

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

在此方法中,只需检索文本字段的值并应用之前尝试过的逻辑。

import UIKit

class ConverterTableViewCell: UITextFieldDelegate {

    @IBOutlet weak var mgdlTextField: UITextField!
    @IBOutlet weak var mmolTextField: UITextField!

    override func awakeFromNib() {
        super.awakeFromNib()

        self.mgdlTextField.delegate = self
        self.mmolTextField.delegate = self
    }

    // MARK: UITextFieldDelegate methods

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

        dispatch_async(dispatch_get_main_queue()) { () -> Void in

            if textField == self.mgdlTextField {

                if let text = textField.text {
                    if let value = Double(text) {
                        self.mmolTextField.text = "\(value / 38.6)"
                        return
                    }
                }
                self.mmolTextField.text = ""


            } else {

                if let text = textField.text {
                    if let value = Double(text) {
                        self.mgdlTextField.text = "\(value * 38.6)"
                        return
                    }
                }
                self.mgdlTextField.text = ""
            }

        }

        return true
    }
}

调度异步是为了确保在实际执行转换之前更新您的值。

希望有所帮助。

编辑:添加了一些实施代码