我正在尝试了解如何从窗口中的文本字段捕获“文本变更”事件。我习惯于Java的“动作监听器”,但在Objective-C/Cocoa中找不到类似的内容。
我搜索了相当长的时间,并发现了“键值观察”协议,但是observeValueForKeyPath:
方法(函数?)仅在我的文本字段的值在代码中被更改时(例如使用[textfield setStringValue:...]
),而不是通过键入更改时才触发。
如何在用户键入文本字段时“监听”其值的更改?
我正在尝试了解如何从窗口中的文本字段捕获“文本变更”事件。我习惯于Java的“动作监听器”,但在Objective-C/Cocoa中找不到类似的内容。
我搜索了相当长的时间,并发现了“键值观察”协议,但是observeValueForKeyPath:
方法(函数?)仅在我的文本字段的值在代码中被更改时(例如使用[textfield setStringValue:...]
),而不是通过键入更改时才触发。
如何在用户键入文本字段时“监听”其值的更改?
NSTextField
实例设置代理,并让代理实现以下方法:- (void)controlTextDidChange:(NSNotification *)notification {
// there was a text change in some control
}
您的委托对象可以是应用程序委托、窗口控制器、视图控制器或应用程序中的其他对象。可以通过编程方式设置委托。
[myTextField setDelegate:delegateObject];
或者,在Interface Builder中,通过NSTextField
控件中可用的delegate
出口。
请注意,如果有多个控件连接到同一个委托,则-controlTextDidChange:
将为每个控件发送,即相同的方法被调用以处理不同的控件。如果您想根据文本更改的控件实现不同的行为,则可以使用-[NSNotification object]
来标识发送通知的控件。
例如,如果您有两个文本字段,对应的出口是nameField
和addressField
,并且您已经为两个字段设置了相同的委托,则:
- (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]
。
- (IBAction)txtField_Changed:(id)sender
{
// my textfield has been changed
}
这对我有效
func textView(textView: NSTextView, shouldChangeTextInRange affectedCharRange: NSRange, replacementString: String?) -> Bool {
print("Changed!")
return true
}
您可以使用 UITextFieldDelegate
的 textFieldShouldBeginEditing:
方法。在iOS中,监听器被称为NSNotifications
编辑
在Objective-C中,许多UI对象都有相应的协议类,称为“delegate”。代理负责响应事件。因此,为了能够响应或收到通知,您需要实现该代理及其方法。
...shouldBeginEditing:
。 - user557219