Swift: 如何在其他文本字段已填充时自动更改文本字段文本?

Swift: How to change textField text automatically when other textField got filled?

我实现了具有两个 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

}

编辑: 我尝试了下面答案中的代码,结果出现了这个错误:

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

相反,您必须将视图控制器注册为文本字段的委托并实现以下 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
    }
}

调度异步在这里确保您的值在您实际执行转换之前得到更新。

希望对您有所帮助。

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