我已经实现了一个委托及其controlTextDidChange
方法,只要我在NSTextField
中输入文字,就会调用它。
当我通过[field setStringValue:@"newText"]
以编程方式设置文本时,controlTextDidChange
未被调用。
你能解释一下吗?我应该如何以编程方式设置一个新值来触发我的委托方法controlTextDidChange
的调用。
答案 0 :(得分:7)
controlTextDidChange
代表仅在用户互动时触发,
手动更新NSControl
设计不会触发委托。
正确的解决方案
解决方案是创建一个单独的方法来处理文本更改:
- (void)myCustomFunction {
// Triggered in case the text is changed,
// no matter by user or programmatically
}
从委托中触发此方法:
- (void)controlTextDidChange:(NSNotification *)aNotification {
[self myCustomFunction];
}
如果文本以编程方式更改:
[theField setStringValue:@"text"];
[self myCustomFunction];
现在你可以在同一种方法中处理这两种情况。
答案 1 :(得分:2)
您可以以编程方式触发controlTextDidChange
功能
[[NSNotificationCenter defaultCenter] postNotificationName: NSControlTextDidChangeNotification
object:textFieldExample
userInfo:[NSDictionary dictionaryWithObject: [[textFieldExample window] fieldEditor:YES
forObject:textFieldExample]
forKey:@"NSFieldEditor"]];
当controlTextDidChange
由多个textFields触发时,这会更有用!
答案 2 :(得分:0)
Oliver P的答案移植到Swift 4.0:
NotificationCenter.default.post(
name: NSControl.textDidChangeNotification,
object: textFieldExample,
userInfo: ["NSFieldEditor":
textFieldExample!.fieldEditor(true, for: textFieldExample)!])
答案 3 :(得分:0)
在我的情况下,只要不加任何userInfo
(迅速5)就可以调用它:
NotificationCenter.default.post(name: NSControl.textDidChangeNotification, object: myTextField)