【问题标题】:UIControlEventEditingChanged doesn't get fired when using setText of UITextfield使用 UITextfield 的 setText 时不会触发 UIControlEventEditingChanged
【发布时间】:2013-02-14 21:54:12
【问题描述】:

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

我正在使用自定义 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。但是,如果我使用计算机键盘更改文本,它会因某种原因被调用。

这是故意的吗?

【问题讨论】:

    标签: ios cocoa-touch uitextfield uidatepicker


    【解决方案1】:

    我不得不给这个问题打分,因为这超级很重要。

    这似乎在 iOS6 中有所改变。甚至可能是iOS5。此事件 USED 成为观察 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

    【讨论】:

    • 感谢您的解决方案,我最终也使用了 sendActionsForControlEvents 方法。
    • insertText 不起作用。但是[textField sendActionsForControlEvents:UIControlEventEditingChanged] 有效。
    • insertText(_:) 应该仅在文本字段是第一响应者时才有效,因为 UIKeyInput 的文档说它在光标位置插入文本。
    【解决方案2】:

    设置文字后直接拨打sendActionsForControlEvents:即可:

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

    在 iOS 9 上测试。

    【讨论】:

      【解决方案3】:

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

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

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

        taskTextField.text = nil
        taskTextField.sendActionsForControlEvents(UIControlEvents.EditingChanged)
        

      【讨论】:

        【解决方案4】:

        更新:Swift 4.2

        textField.text = "some Text"
        textField.sendActions(for: UIControl.Event.editingChanged)
        

        【讨论】:

          【解决方案5】:

          文档说:

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

          所以只能触摸

          【讨论】:

            猜你喜欢
            • 2018-09-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-01
            • 1970-01-01
            相关资源
            最近更新 更多