我想在NSTextField上使用答案中的代码:How to observe the value of an NSTextField,以便观察存储在NSTextField中的字符串的变化。
[[NSNotificationCenter defaultCenter]
addObserverForName:NSTextViewDidChangeSelectionNotification
object:self.textView
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note){
NSLog(@"Text: %@", self.textView.textStorage.string);
}];
这里使用的类是NSTextView。我在NSTextField中找不到通知而不是使用NSTextViewDidChangeSelectionNotification。
在这种情况下,NSTextField中是否有可用的通知?
答案 0 :(得分:102)
如果您只想检测文本字段的值何时发生更改,则可以使用NSTextField
从NSControl
继承的controlTextDidChange:
委托方法。
只需将nib文件中delegate
的{{1}}出口连接到控制器类,然后执行以下操作:
NSTextField
如果您是以编程方式创建- (void)controlTextDidChange:(NSNotification *)notification {
NSTextField *textField = [notification object];
NSLog(@"controlTextDidChange: stringValue == %@", [textField stringValue]);
}
,则可以在创建后使用NSTextField
的{{3}}方法来指定代理:
NSTextField
委托是整个Cocoa中使用的基本设计模式之一。简而言之,它允许您轻松自定义标准对象(在本例中为用户界面对象)的行为,而不必涉及必须子类化对象以添加其他行为。例如,检测文本字段中文本何时发生更改的另一种低级方法可能是创建自己的自定义NSTextField *textField = [[[NSTextField alloc] initWithFrame:someRect] autorelease];
[textField setDelegate:self]; // or whatever object you want
子类,在该子类中覆盖NSTextField
从NSTextField
继承的方法NSResponder
。但是,这样的子类化很难,因为它可能要求您对对象的继承层次结构有深入的了解。有关详细信息,请务必查看以下内容:
关于id <NSTextFieldDelegate>
的含义:它表示声明自身符合id
协议的通用对象(<NSTextFieldDelegate>
)。有关协议的更多信息,请参阅keyDown:
。
示例GitHub项目:Cocoa Fundamentals Guide: Delegates and Data Sources
答案 1 :(得分:6)
Xcode 9.2。使用Swift 4.0.3。
必须通过接口构建器连接NSTextField才能使此实现正常工作。
import Cocoa
@objc public class MyWindowController: NSWindowController, NSTextFieldDelegate {
@IBOutlet weak var myTextField: NSTextField!
// MARK: - ViewController lifecycle -
override public func windowDidLoad() {
super.windowDidLoad()
myTextField.delegate = self
}
// MARK: - NSTextFieldDelegate -
public override func controlTextDidChange(_ obj: Notification) {
// check the identifier to be sure you have the correct textfield if more are used
if let textField = obj.object as? NSTextField, self.myTextField.identifier == textField.identifier {
print("\n\nMy own textField = \(self.myTextField)\nNotification textfield = \(textField)")
print("\nChanged text = \(textField.stringValue)\n")
}
}
}
控制台输出:
My own textField = Optional(<myApp.NSTextField 0x103f1e720>)
Notification textfield = <myApp.NSTextField: 0x103f1e720>
Changed text = asdasdasddsada
答案 2 :(得分:0)
我相信您想要阅读field editor,它基本上是一个(隐藏的)NSTextView
,用于处理给定窗口中所有NSTextField
的文本输入。 "Using Delegation and Notification With the Field Editor"部分应该指出正确的方向。
答案 3 :(得分:0)
在Swift中它
public override func controlTextDidChange(_ obj: Notification) {
}
答案 4 :(得分:0)
您应该使用NSTextFieldDelegate
并实现controlTextDidChange
。在macOS 10.14和Swift 4.2中进行测试
import Cocoa
class ViewController: NSViewController, NSTextFieldDelegate {
@IBOutlet weak var textField: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = self
}
func controlTextDidChange(_ obj: Notification) {
let textField = obj.object as! NSTextField
print(textField.stringValue)
}
}