2012-07-14 81 views
42

我想使用此問題的答案中的代碼:How to observe the value of an NSTextField在NSTextField上,以便觀察存儲在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中是否有可用的通知?

+1

你能澄清是否你正在尋找時通知文本字段的stringValue的變化,或當所選文本的變化(如鏈接的答案交易)? – NSGod 2012-07-15 01:11:54

回答

89

如果您只是想檢測文本字段的值何時發生更改,則可以使用NSTextFieldNSControl繼承的controlTextDidChange:委託方法。

只需連接delegate出口NSTextField的筆尖文件到您的控制器類,並實現這樣的事情:

- (void)controlTextDidChange:(NSNotification *)notification { 
    NSTextField *textField = [notification object]; 
    NSLog(@"controlTextDidChange: stringValue == %@", [textField stringValue]); 
} 

如果您正在創建的NSTextField編程,您可以使用NSTextFieldsetDelegate:創建後指定代理的方法:

NSTextField *textField = [[[NSTextField alloc] initWithFrame:someRect] autorelease]; 
[textField setDelegate:self]; // or whatever object you want 

委派是整個Cocoa使用的基本設計模式之一。簡而言之,它允許您輕鬆定製標準對象(在這種情況下爲用戶界面對象)的行爲,而無需爲子對象添加額外的行爲而帶來複雜性。例如,檢測文本字段中的文本何時發生更改的另一種較低級別的方法可能是創建您自己的自定義NSTextField子類,在此子類中,您覆蓋繼承自NSResponderkeyDown:方法。但是,像這樣的子類很困難,因爲它可能要求您對對象的繼承層次有深入的瞭解。欲瞭解更多信息,肯定檢查了以下工作:

Cocoa Fundamentals Guide: Delegates and Data Sources

關於什麼id <NSTextFieldDelegate>意味着:它意味着一個通用對象(id)聲明本身符合<NSTextFieldDelegate>協議。有關協議的更多信息,請參閱The Objective-C Programming Language: Protocols

樣品GitHub的項目在:https://github.com/NSGod/MDControlTextDidChange

+0

我不是用IB創建NSTextField,而是以編程方式。有一個等價的方法? – alecail 2012-07-15 02:23:47

+0

已更新的程序創建答案 – NSGod 2012-07-15 10:32:25

+0

代表對我來說是新的。我不知道'id 是什麼,以及在哪裏放置'setDelegate'的'controlTextDidChange'方法但我很快就會發現 – alecail 2012-07-15 10:55:01

0

我相信你想要讀取field editor,它本質上是一個(隱藏)NSTextView,它處理給定窗口中所有NSTextField的文本輸入。關於"Using Delegation and Notification With the Field Editor"的部分應該指向正確的方向。

+1

破碎的鏈接:(試試這裏:https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/TextFieldsAndViews/TextFieldsAndViews.html – ericpeters0n 2014-06-18 22:19:35

0

在斯威夫特是

public override func controlTextDidChange(_ obj: Notification) { 


} 
0

的Xcode 9.2。與斯威夫特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