收听我的文本字段的值更改

时间:2011-05-28 21:33:39

标签: objective-c cocoa macos listener nstextfield

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

当用户键入文本字段时,如何“监听”值更改?

4 个答案:

答案 0 :(得分:36)

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

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

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

[myTextField setDelegate:delegateObject];

或在Interface Builder中,通过delegate控件中提供的NSTextField插座。

请注意,如果有多个控件挂钩到同一个委托,那么将为每个控件发送-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]

答案 1 :(得分:3)

您也可以直接连接IB中的“编辑已更改”并创建操作来处理它

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

答案 2 :(得分:0)

这对我有用

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

答案 3 :(得分:-3)

您可以使用textFieldShouldBeginEditing:的{​​{1}}方法。在iOS中,侦听器称为NSNotifications

编辑

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