【问题标题】:Listen to a value change of my text field听我的文本字段的值变化
【发布时间】:2011-05-28 21:33:38
【问题描述】:

我正在尝试了解如何从窗口中的文本字段中捕获“文本更改”事件。我习惯了 Java 的“动作监听器”,在 Objective-C/Cocoa 中找不到类似的东西。 我搜索了很长时间,找到了“键值观察”协议,但是observeValueForKeyPath: 方法(函数?)仅在我的文本字段的值在代码中更改时触发(例如使用[textfield setStringValue:...]),而不是通过输入它。

当用户在文本字段中键入时,我如何“监听”值的变化?

【问题讨论】:

    标签: objective-c cocoa macos listener nstextfield


    【解决方案1】:

    您可以为您的NSTextField 实例设置一个委托,并让该委托实现以下方法:

    - (void)controlTextDidChange:(NSNotification *)notification {
        // there was a text change in some control
    }
    

    您的委托对象可以是应用程序委托、窗口控制器、视图控制器或您的应用程序中的一些其他对象。委托可以通过编程方式设置

    [myTextField setDelegate:delegateObject];
    

    或者,在 Interface Builder 中,通过 NSTextField 控件中可用的 delegate 插座。

    请注意,如果有多个控件连接到同一个委托,则将为每个控件发送-controlTextDidChange:,即,为不同的控件调用相同的方法。如果你想根据文本发生变化的控件有不同的行为,可以使用-[NSNotification object]来标识发送通知的控件。

    例如,如果您有两个文本字段与对应的出口 nameFieldaddressField,并且您为这两个字段设置了相同的委托,那么:

    - (void)controlTextDidChange:(NSNotification *)notification {
        // there was a text change in some control
        // [notification object] points to the control that has sent
        // the notification
    
        if ([notification object] == nameField) {
            // nameField has changed
        }
        else if ([notification object] == addressField) {
            // addressField has changed
        }
    }
    

    或者,您可以为每个文本字段设置一个代表。在这种情况下,无需测试[notification object]

    【讨论】:

    • 谢谢,那是我要寻找的下一个东西!我认为为每个需要委托的对象创建新类很不方便
    • @Eike 请注意,Cyprian 的答案是针对 iOS 的,并且使用了错误的方法来满足您的需求。 …shouldBeginEditing: 在您想要控制文本字段是否应允许编辑文本时实现。
    • 附带问题:是否有人了解如何预测给定事件是否可以通过 IB 获得或需要委托机制?是 Apple 对事件使用频率的估计,还是比这更正式?
    【解决方案2】:

    您也可以从 IB 连接到“编辑更改”并创建操作来处理它

    - (IBAction)txtField_Changed:(id)sender
    {
       // my textfield has been changed
    }
    

    【讨论】:

      【解决方案3】:

      这对我有用

      func textView(textView: NSTextView, shouldChangeTextInRange affectedCharRange: NSRange, replacementString: String?) -> Bool {
          print("Changed!")
          return true
      }
      

      【讨论】:

        【解决方案4】:

        您可以使用UITextFieldDelegatetextFieldShouldBeginEditing: 方法。在 iOS 中,监听器被称为 NSNotifications

        编辑

        在 Objective-c 中,很多 UIObject 都有一个相应的协议类,称为“委托”,委托负责对事件做出反应。因此,为了能够响应或收到有关您需要实现委托及其方法的操作的通知。

        【讨论】:

        • 错误的操作系统(OSX 不是 iOS),错误的控件类(NSTextField 不是 UITextField)
        • 抱歉,Notification 不是监听器。您将自己作为观察者添加到通知中心以接收通知。
        猜你喜欢
        • 1970-01-01
        • 2018-05-31
        • 1970-01-01
        • 2011-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-24
        • 1970-01-01
        相关资源
        最近更新 更多