3

我已经实现了一个委托及其controlTextDidChange方法,每当我在NSTextField.

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

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

4

4 回答 4

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];

现在您可以在同一方法中处理这两种情况。

于 2012-09-26T22:16:09.657 回答
3

controlTextDidChange您可以以编程方式触发该功能

[[NSNotificationCenter defaultCenter] postNotificationName: NSControlTextDidChangeNotification
                                                    object:textFieldExample
                                                  userInfo:[NSDictionary dictionaryWithObject: [[textFieldExample window] fieldEditor:YES
                                                                                                                           forObject:textFieldExample]
                                                                                       forKey:@"NSFieldEditor"]];

这更有用,当controlTextDidChange由多个文本字段触发时!

于 2016-08-05T16:10:41.543 回答
0

Oliver P 的答案移植到 Swift 4.0:

NotificationCenter.default.post(
    name: NSControl.textDidChangeNotification,
    object: textFieldExample,
    userInfo: ["NSFieldEditor":
        textFieldExample!.fieldEditor(true, for: textFieldExample)!])
于 2018-04-17T02:27:46.690 回答
0

在我的情况下,调用它就足够了,没有任何userInfo(Swift 5):

NotificationCenter.default.post(name: NSControl.textDidChangeNotification, object: myTextField)
于 2019-12-14T13:21:42.210 回答