检测UITextfield中的文本更改

RGr*_*ths 21 objective-c uitextfield ipad uitextfielddelegate ios6

我希望能够检测是否有一些文本被更改,UITextField以便我可以启用a UIButton来保存更改.

Dar*_*ust 39

而不是观察通知或实现textField:shouldChangeCharacterInRange:replacementString:,只是添加事件目标更容易:

[textField addTarget:self
              action:@selector(myTextFieldDidChange:)
    forControlEvents:UIControlEventEditingChanged];

- (void)myTextFieldDidChange:(id)sender {
    // Handle change.
}
Run Code Online (Sandbox Code Playgroud)

需要注意的是该事件UIControlEventEditingChanged不会 UIControlEventValueChanged!

与其他两个建议的解决方案相比的优势是:

  • 你不需要记得用你的控制器取消注册NSNotificationCenter.
  • 在进行更改调用事件处理程序,这意味着textField.text包含用户实际输入的文本.该textField:shouldChangeCharacterInRange:replacementString:委托方法被调用之前已应用的变化,所以textField.text还没有给你的文字刚刚进入用户-你必须自己先应用更改.


Aar*_*den 33

利用UITextFieldTextDidChange通知或在文本字段上设置委托,并观察textField:shouldChangeCharactersInRange:replacementString.

如果您想通过通知查看更改,您需要在代码中注册以下内容以注册通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:theTextField];
Run Code Online (Sandbox Code Playgroud)

这里theTextField是您要观看的UITextField的实例.self是上面代码中的一个实例的类必须实现textFieldDidChange,如下所示:

- (void)textFieldDidChange:(NSNotification *)notification {
    // Do whatever you like to respond to text changes here.
}
Run Code Online (Sandbox Code Playgroud)

如果文本字段将比观察者更长,那么您必须在观察者的dealloc方法中取消注册通知.实际上,即使文本字段没有比观察者活得多,这也是一个好主意.

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    // Other dealloc work
}
Run Code Online (Sandbox Code Playgroud)


Jes*_*ese 9

为此,首先需要让文本字段为其分配委托引用.并且delgate应该优选地是视图的文件所有者的vew控制器.这就像

myTextField.delegate = myViewControllerReferenceVariable
Run Code Online (Sandbox Code Playgroud)

在你的viewController接口中,告诉你将实现UITextFieldDelegate

@interface MyViewController:UIViewController<UITextFieldDelegate>
Run Code Online (Sandbox Code Playgroud)

并在您的视图中控制器实现覆盖

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

所以代码看起来像

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
     {
        text = [textfield.text stringByReplacingCharactersInRange:range withString:string];
        if (textfield == refToTextFieldYouWantToCheck) {
            if ( ! [textToCheck isEqualToString:text] ) {
               [theButtonRef setEnabled:YES];
            } 
         }
           return YES; //If you don't your textfield won't get any text in it
      }
Run Code Online (Sandbox Code Playgroud)

你也可以订阅一些杂乱的通知恕我直言你可以在这里找到如何做到这一点.

  • 这是正确的答案,不确定为什么它不是被接受的答案.每当输入或删除新字符时,都会触发此特定方法.如果您只想检查内容长度是否大于0,那么使用其他委托方法之一,如didBeginEditing,等 (2认同)