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

Eik*_*chu 16 macos cocoa objective-c listener nstextfield

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

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

小智 36

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

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

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

[myTextField setDelegate:delegateObject];
Run Code Online (Sandbox Code Playgroud)

或者,在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
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以为每个文本字段设置一个代理.在这种情况下,没有必要进行测试[notification object].