Swift: 如何让 UITextField 在用户未设置其文本时做出反应?
Swift: How to make UITextField react when its text isn't set by a user?
我有两个文本字段,编辑其中一个会填充另一个:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
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
}
当我想检索自填文本字段的值时出现问题,我添加目标:
cell.mmolTextField.addTarget(self, action: "updateLDL1:", forControlEvents: UIControlEvents .EditingChanged)
上面的动作没有被调用,我想这可能是因为没有将其作为控制事件注意到的结果。
我尝试将 .EditingChanged 更改为 .AllEvents 但这不是解决方案。
你会如何处理这样的问题?也许 NSNotifications 可以派上用场?
提前致谢
尝试使用 UIControlEventValueChanged
这是针对 Obj-C 的,找到 swift 的等价物。
我相信您为 UITextField 分配了一个委托。
委托有方法 textFieldDidBeginEditing: 和 textFieldDidEndEditing: 应该在这里帮助你。无需实现其他触摸控件。
您需要自己触发事件:
self.mmolTextField.sendActionsForControlEvents(.EditingChanged)
您可以使用键值编码:
var textField: UITextField!
var observer: NSObject!
func textFieldObserverTest() {
if textField == nil {
textField = UITextField()
observer = TextFieldObserver()
textField.addObserver(observer, forKeyPath: "text", options: NSKeyValueObservingOptions.New, context: nil)
}
textField.text = "Hello World"
textField.text = "Goodbye World"
textField.text = "Its all over"
}
class TextFieldObserver : NSObject {
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
print("\(keyPath!) changed to \(change![NSKeyValueChangeNewKey])")
}
}
我有两个文本字段,编辑其中一个会填充另一个:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
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
}
当我想检索自填文本字段的值时出现问题,我添加目标:
cell.mmolTextField.addTarget(self, action: "updateLDL1:", forControlEvents: UIControlEvents .EditingChanged)
上面的动作没有被调用,我想这可能是因为没有将其作为控制事件注意到的结果。 我尝试将 .EditingChanged 更改为 .AllEvents 但这不是解决方案。
你会如何处理这样的问题?也许 NSNotifications 可以派上用场?
提前致谢
尝试使用 UIControlEventValueChanged
这是针对 Obj-C 的,找到 swift 的等价物。
我相信您为 UITextField 分配了一个委托。 委托有方法 textFieldDidBeginEditing: 和 textFieldDidEndEditing: 应该在这里帮助你。无需实现其他触摸控件。
您需要自己触发事件:
self.mmolTextField.sendActionsForControlEvents(.EditingChanged)
您可以使用键值编码:
var textField: UITextField!
var observer: NSObject!
func textFieldObserverTest() {
if textField == nil {
textField = UITextField()
observer = TextFieldObserver()
textField.addObserver(observer, forKeyPath: "text", options: NSKeyValueObservingOptions.New, context: nil)
}
textField.text = "Hello World"
textField.text = "Goodbye World"
textField.text = "Its all over"
}
class TextFieldObserver : NSObject {
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
print("\(keyPath!) changed to \(change![NSKeyValueChangeNewKey])")
}
}