51

我目前正在尝试跟踪文本字段的状态。

我正在使用自定义 datePicker 来设置文本-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");
}

如果我通过自定义 Datepicker 更改文本,travelToOnDateTextFieldDidChange则不会调用 Method。但是,如果我使用计算机键盘更改文本,它会因某种原因被调用。

这是故意的吗?

4

5 回答 5

82

我不得不评价这个问题,因为这非常重要

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

[UITextField insertText];

和其他人使用

[UITextField setText];

或者

UITextField.text = @"xxx";

无论出于何种原因,重要的是要注意setText事件不再触发 Editing Changed 事件。如果您使用 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

于 2013-04-05T23:48:24.757 回答
19

sendActionsForControlEvents:设置文本后只需调用:

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

在 iOS 9 上测试。

于 2016-03-12T09:00:00.907 回答
7

在 Swift 2.2+ 中,基于@Shaolo 的回答

  1. 连接IBAction,注意将默认事件类型改为EditingChanged

在此处输入图像描述

  1. 从代码中更改 textField 的文本后,还要添加 sendActionsLine

    taskTextField.text = nil
    taskTextField.sendActionsForControlEvents(UIControlEvents.EditingChanged)
    
于 2016-08-10T07:13:35.030 回答
5

更新:斯威夫特 4.2

textField.text = "some Text"
textField.sendActions(for: UIControl.Event.editingChanged)
于 2019-03-24T21:06:52.437 回答
4

文档说:

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

所以只能

于 2013-02-28T17:16:00.397 回答