我实现了两个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
}
编辑: 我在下面的答案中尝试了代码并最终得到了这个错误:
答案 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
}
}
调度异步是为了确保在实际执行转换之前更新您的值。
希望有所帮助。
编辑:添加了一些实施代码