在setStringValue上没有调用ControlTextDidChange

时间:2012-09-26 21:55:19

标签: objective-c xcode cocoa

我已经实现了一个委托及其controlTextDidChange方法,只要我在NSTextField中输入文字,就会调用它。

当我通过[field setStringValue:@"newText"]以编程方式设置文本时,controlTextDidChange未被调用。

你能解释一下吗?我应该如何以编程方式设置一个新值来触发我的委托方法controlTextDidChange的调用。

4 个答案:

答案 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)