2013-02-28 101 views
38

我目前正试图跟踪文本字段的状态。UIControlEventEditingChanged在使用UITextfield的setText时不会被触发

我使用的是自定义的日期选择器,其通过-setText

[self.textField setText:[self.dateFormatter stringFromDate:self.date]]; 

设置文本里面我textFieldDelegate我写了下面的代码:

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    self.travelToOnTextField.delegate = self; 
    [self.travelToOnTextField addTarget:self action:@selector(travelToOnTextFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; 
} 

-(void)travelToOnTextFieldDidChange:(id)sender 
{ 
    NSLog(@"Event Handler called"); 
} 

如果我通过自定义的日期选择器更改文本方法travelToOnDateTextFieldDidChange不会被调用。但如果我使用电脑键盘改变文本,会因某种原因而被调用。

这是故意的吗?

回答

68

我不得不评价这个问题,因为这是超级重要。

看起来这已经在iOS6中发生了变化。甚至可能是iOS5。此事件已用是观察UITextField中文本更改的首选方法。自从iOS3以来,我一直在使用它。在iOS6上重新编译我的应用程序以执行某些更新之后,它神秘地停止了工作。我的应用程序使用的部件:

[UITextField insertText]; 

和其他人使用

[UITextField setText]; 

UITextField.text = @"xxx"; 

无论出于何种原因,需要注意的是的setText事件不再触发编辑是非常重要的改变了事件。如果您使用insertText方法,它仍然有效。

所以如果你陷入困境,你只需要一个快速解决,您可以更改您的代码从出来:

textField.text; 

[textField setText:@"xxx"]; 

textField.text = @""; 
[textField insertText:@"new text"]; 

这也适用:

[((UITextField*)view) sendActionsForControlEvents:UIControlEventEditingChanged]; 

我希望这可以帮助某人,因为我浪费了整整一天的时间,试图弄清为什么当我移动到iOS6时,此代码突然停止工作。

您仍然可以使用NSNotificationCenter。更多信息请参阅参考的UITextField:

https://developer.apple.com/documentation/uikit/uitextfield

+1

感谢您的解决方案,我也结束了使用sendActionsForControlEvents方法。 – 2013-04-09 10:07:33

+1

insertText不起作用。但'[textField sendActionsForControlEvents:UIControlEventEditingChanged]'工作。 – Gon 2016-03-12 07:55:16

+0

'insertText(_ :)'应该只在文本字段是第一响应者时才起作用,因为“UIKeyInput”的文档说它在光标位置插入文本。 – Raginmari 2016-05-03 09:13:42

4

文档说:

UIControlEventEditingChanged 
A touch making an editing change in a UITextField objet. 
Available in iOS 2.0 and later. 
Declared in UIControl.h. 

所以触摸只?

9

只要打电话sendActionsForControlEvents:您设置的文本之后:

self.textField.text = xxx; 
[self.textField sendActionsForControlEvents:UIControlEventEditingChanged]; 

测试在iOS 9

+0

感谢您的支持! – 2016-06-10 19:50:12

4

在斯威夫特2.2+,基于@ Shaolo的回答

  1. 连接IBAction,注意改变默认前夕NT类型EditingChanged

enter image description here

  • 你从代码更改文本框的文本后,还添加sendActionsLine

    taskTextField.text = nil 
    taskTextField.sendActionsForControlEvents(UIControlEvents.EditingChanged) 
    
  • 相关问题