我正在尝试了解如何从窗口中的文本字段中捕获“文本已更改”事件。我已经习惯了Java的“动作监听器”,并且在Objective-C / Cocoa中找不到类似的东西。
我搜索了很长一段时间并找到了“键值观察”协议,但observeValueForKeyPath:
方法(函数?)仅在我的文本字段的值在代码中更改时触发(使用[textfield setStringValue:...]
,例如),而不是输入它。
当用户键入文本字段时,如何“监听”值更改?
答案 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]
来标识已发送通知的控件。
例如,如果您有两个包含相应商店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]
。
答案 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都有一个相应的协议类,称为“委托”委托负责对事件做出反应。因此,为了能够响应或通知您需要实现委托及其方法的操作。