当字段更新时,UITextField"值已更改"未触发

And*_*nov 68 cocoa-touch objective-c interface-builder ios

我有一个IBAction我已连接到UITextFieldInterface Builder中的元素.(以"价值变化"事件为准)

我也有一个UISlider在调整值时自动更新TextField元素.

当我运行我的应用程序时,TextField会在我调整滑块时更新,但是当发生这种情况时,"值已更改"事件不会触发.当我手动编辑TextField时,值更改事件也不会触发.(虽然使用Did Editing End触发器确实会触发它).

我的问题是,如何在TextField的程序更新以及用户调整值时触发值更改触发器.

Mar*_*ams 207

不要使用UIControlEventValueChangedUITextField.你想要的是什么UIControlEventEditingChanged.

  • 这应该是公认的答案.`UITextFieldDelegate`完全不同. (6认同)
  • 我不是在争论是否有效,但我想知道为什么会这样? (4认同)
  • 我尝试了那个,当文本字段以编程方式更改时它不会触发. (3认同)
  • 正确,没有任何目标/操作事件被设计用于程序更改. (3认同)

iKT*_*iKT 70

为了得到EditingChanged textfield event,我建议添加选择器为

[textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];
Run Code Online (Sandbox Code Playgroud)

随着文本字段值的更改,您将从此textChanged:选择器获得更改的值.

-(void)textChanged:(UITextField *)textField
{
    NSLog(@"textfield data %@ ",textField.text);
}
Run Code Online (Sandbox Code Playgroud)


Nec*_*ech 11

如果您正在为文本字段分配委托,请注意(当您从下面的委托方法返回NO时,将不会触发事件(编辑已更改).当您从此方法返回NO时,请考虑调用事件侦听器

(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
Run Code Online (Sandbox Code Playgroud)

  • 编辑更改事件将不会被触发,因为字段*没有改变* - 这就是返回NO的作用! (3认同)

Ila*_*ian -1

根据 TheRonin 的建议,使用UITextFieldDelegate并实现以下方法

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
Run Code Online (Sandbox Code Playgroud)

  • 此方法的问题在于它是在提交键入的字符之前调用的。也就是说,如果您先输入“fo”,然后再输入“o”,则“textField.text”仍然是“fo”,而不是“foo”。您必须手动应用更改才能获取文本字段将设置为的字符串。 (19认同)
  • 使用这个不是更符合逻辑吗?`UITextFieldTextDidChangeNotification` ,但是我不确定如何实现它。 (3认同)