NSTextField的文本更改通知

时间:2012-07-14 21:15:06

标签: cocoa observer-pattern nstextfield nsnotifications

我想在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中是否有可用的通知?

5 个答案:

答案 0 :(得分:102)

如果您只想检测文本字段的值何时发生更改,则可以使用NSTextFieldNSControl继承的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 子类,在该子类中覆盖NSTextFieldNSTextField继承的方法NSResponder。但是,这样的子类化很难,因为它可能要求您对对象的继承层次结构有深入的了解。有关详细信息,请务必查看以下内容:

setDelegate:

关于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)
  }
}