监听文本框数值变化的方法

16

我正在尝试了解如何从窗口中的文本字段捕获“文本变更”事件。我习惯于Java的“动作监听器”,但在Objective-C/Cocoa中找不到类似的内容。

我搜索了相当长的时间,并发现了“键值观察”协议,但是observeValueForKeyPath:方法(函数?)仅在我的文本字段的值在代码中被更改时(例如使用[textfield setStringValue:...]),而不是通过键入更改时才触发。

如何在用户键入文本字段时“监听”其值的更改?

4个回答

36
你可以为你的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 Cochu
@Eike 注意,Cyprian的答案适用于iOS,并且对于您想要的内容使用了错误的方法。当您想要控制文本字段是否允许编辑文本时,应该实现...shouldBeginEditing: - user557219
旁边的问题:有人知道如何“预测”一个给定事件是通过IB可用还是需要使用委托机制吗?这是苹果估计事件将被使用的常见程度,还是比那更正式的东西? - orion elenzil

3
您也可以通过连接到IB中的“编辑已更改”来创建处理它的操作。
- (IBAction)txtField_Changed:(id)sender
{
   // my textfield has been changed
}

0

这对我有效

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

-3

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

编辑

在Objective-C中,许多UI对象都有相应的协议类,称为“delegate”。代理负责响应事件。因此,为了能够响应或收到通知,您需要实现该代理及其方法。


4
错误的操作系统(应为OSX而非iOS),错误的控件类别(应为NSTextField而非UITextField)。 - Till
抱歉,但通知不是监听器。您需要将自己作为观察者添加到通知中心以接收通知。 - igraczech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接