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
}
}
调度异步在这里确保您的值在您实际执行转换之前得到更新。
希望对您有所帮助。
编辑:添加了一些实现代码
我实现了具有两个 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
}
}
调度异步在这里确保您的值在您实际执行转换之前得到更新。
希望对您有所帮助。
编辑:添加了一些实现代码