我有一个IBAction
,我已经连接到Interface Builder中的UITextField
元素。 (以“价值变化”事件为准)
我还有一个UISlider
,当它的值被调整时自动更新TextField元素。
当我运行我的应用程序时,TextField会在我调整滑块时更新,但是当发生这种情况时,“值已更改”事件不会触发。当我手动编辑TextField时,值更改事件也不会触发。 (虽然使用Did Editing End触发器确实会触发它)。
我的问题是,如何在TextField的程序更新以及用户调整值时触发值更改触发器。
正如TheRonin所建议的那样,使用UITextFieldDelegate
并实现以下方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
不要将UIControlEventValueChanged
用于UITextField
。你想要的是UIControlEventEditingChanged
。
为了获得EditingChanged textfield event
,我建议添加选择器为
[textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];
随着文本字段值的更改,您将从此textChanged:
选择器获得更改的值。
-(void)textChanged:(UITextField *)textField
{
NSLog(@"textfield data %@ ",textField.text);
}
如果您正在为文本字段分配委托,请注意(当您从下面的委托方法返回NO时,将不会触发事件(编辑已更改)。当您从此方法返回NO时,请考虑调用事件侦听器
(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
一个老问题,但我发现的第一个搜索结果,并没有一个答案令人满意。我发现这个解决方案效果最好:Swift UITextField subclass handle text change programmatically。
覆盖UITextField的text属性以添加didSet(),并从那里调用值更改函数。
override open var text: String? {
didSet {
myValueDidChange()
}
}
斯威夫特4:
class YourViewController: UIViewController {
// MARK: Outlets
@IBOutlet weak var titleTextField: UITextField!
// MARK: View lifecycle
override func viewDidLoad() {
super.viewDidLoad()
titleTextField.delegate = self
}
}
// MARK: UITextFieldDelegate methods
extension YourViewController: UITextFieldDelegate {
func textField(_ textField: UITextField,
shouldChangeCharactersIn range: NSRange,
replacementString string: String) -> Bool {
print("changed")
return true
}
}
对于Swift 3:
textField.addTarget(self, action: #selector(textChanged), for: .valueChanged)
func textChanged() {
....
}