22

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

4

7 回答 7

40

而不是观察通知或实现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
于 2014-07-17T09:58:34.463 回答
36

利用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
}
于 2013-03-19T01:27:46.380 回答
9

为此,首先您需要为您的文本字段分配委托引用。并且,最好应该是作为视图文件所有者的 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
      }

您还可以订阅有点混乱恕我直言的通知您可以在此处找到操作方法。

于 2013-03-19T02:14:39.960 回答
3

斯威夫特 3.0

过程 1

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

 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
 }
于 2017-02-21T07:38:25.347 回答
2

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

例如:

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

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

于 2017-10-12T04:25:44.283 回答
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];
于 2013-03-19T02:14:28.097 回答
-3

你可以像这样添加一个班级成员NSString *changeTemp,然后

changetemp = textfield;

if( change temp != textfild ){
    changetemp=textfild;
    NSLog(@" text is changed"
} else { 
    NSLog(@" text isn't changed"):
}
于 2013-03-19T01:42:58.437 回答