检测UITextfield中的文本更改

时间:2013-03-19 01:21:20

标签: objective-c ipad ios6 uitextfield uitextfielddelegate

我希望能够检测UITextField中是否更改了某些文字,以便我可以启用UIButton来保存更改。

7 个答案:

答案 0 :(得分:39)

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

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

- (void)myTextFieldDidChange:(id)sender {
    // Handle change.
}

请注意,该活动为UIControlEventEditingChanged UIControlEventValueChanged

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

  • 您无需记得使用NSNotificationCenter取消注册您的控制器。
  • 在进行更改后,事件处理程序称为,这意味着textField.text包含用户实际输入的文本。在应用更改之前,textField:shouldChangeCharacterInRange:replacementString:委托方法称为,因此textField.text尚未向您提供用户刚刚输入的文本 - 您必须应用更改先自己。

答案 1 :(得分:32)

利用UITextFieldTextDidChange通知或在文本字段中设置代理并观看textField:shouldChangeCharactersInRange:replacementString

如果您想通过通知关注更改,您需要在代码中输入类似内容以注册notification

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:theTextField];

此处theTextField是您要观看的UITextField的实例。其中self是上面代码中的实例的类必须实现textFieldDidChange,如下所示:

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

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

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    // Other dealloc work
}

答案 2 :(得分:9)

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

myTextField.delegate = myViewControllerReferenceVariable

在你的viewController界面中,告诉你将通过

实现UITextFieldDelegate
@interface MyViewController:UIViewController<UITextFieldDelegate>

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

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

所以代码看起来像

- (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
      }

您还可以订阅有点混乱的恕我直言的通知 你可以找到如何做到here

答案 3 :(得分:2)

Swift 3.0

流程1

创建UITextfiled的IBOutlet并将目标添加到文本字段。

 m_lblTxt.addTarget(self, action: #selector(self.textFieldDidChange), for: UIControlEvents.editingChanged)

 func textFieldDidChange(textField:UITextField)
 {
     NSLog(textField.text!)
 }

流程2

 m_lblTxt.delegate = self

 //MARK: - TextField Delegates
 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
 {
      print(textField.text!)
      return true
 }

答案 4 :(得分:1)

您可以创建一个变量来存储原始字符串,然后向通知中心注册以接收UITextFieldTextDidChangeNotification事件:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateButton:) name:UITextFieldTextDidChangeNotification object:nil];

然后,创建一个接收通知的方法,并将文本字段的当前值与原始值进行比较

-(void) updateButton:(NSNotification *)notification {
       self.myButton.enabled = ![self.myTextField.text isEqualToString:originalString];
}

取消分配视图控制器时,不要忘记取消注册通知。

[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];

答案 5 :(得分:1)

这可以在Editing Changed事件UITextField的Interface Builder中完成。从中拖动到您的代码并创建IBAction

例如:

@IBAction func textFieldChanged(_ sender: UITextField) {
  print(sender.text)
}

此事件与此处其他答案中描述的相同,因为.text属性在触发时包含更新的文本输入。这可以帮助清理代码混乱,方法是不必以编程方式将事件添加到视图中的每个UITextField

答案 6 :(得分:-3)

您可以添加类似NSString *changeTemp的类成员,然后添加

changetemp = textfield;

if( change temp != textfild ){
    changetemp=textfild;
    NSLog(@" text is changed"
} else { 
    NSLog(@" text isn't changed"):
}