-->

检测的UITextField更改文本(Detecting a change to text in U

2019-08-17 17:45发布

我想,如果一些文本是在改变能够检测UITextField ,这样我就可以启用一个UIButton保存更改。

Answer 1:

充分利用的UITextFieldTextDidChange通知或设置文本字段的委托,并注意textField:shouldChangeCharactersInRange:replacementString

如果你想观看与通知的变化,你需要这样的事情在你的代码为注册notification

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

这里theTextField是实例UITextField要观看。 类,其自的是在代码的实例上述然后必须执行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
}


Answer 2:

相反,观察通知或实施的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还没有给你用户只需输入的文本-你必须自己先应用更改。


Answer 3:

对于这一点,首先你需要让你的文本框有其委派参考分配。 和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
      }

您还可以订阅通知这是有点乱恕我直言,你可以找到如何做到这一点在这里 。



Answer 4:

雨燕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
 }


Answer 5:

您可以创建一个变量来存储原始字符串,然后与通知中心注册接收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];


Answer 6:

这可以在Interface Builder上完成Editing Changed的情况UITextField 。 从它拖动到你的代码,并创建一个IBAction

例如:

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

本次活动是在其他的答案在于这里所描述的相同.text属性包含更新的文本输入时被触发。 这可以帮助不必事件编程方式添加到每个清理代码杂乱UITextField在视图中。



Answer 7:

您可以添加一个类的成员像这样NSString *changeTemp ,然后

changetemp = textfield;

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


文章来源: Detecting a change to text in UITextfield