2017-09-07 5 views
0

NSViewController中身が変わるたびに通知を出すNSTexFieldがあります。テキスト交換に関するswift macOS通知

また、NSTextFieldに文字を書き込むためにIBActionsが定義されたボタンがいくつかあります。 しかし、ボタンの1つが押されるたびに、NSTextFieldが更新されます。通知は行われません。

手動でNSControlTextDidChangeイベントを発生させるにはどうすればよいですか?

override func controlTextDidChange(_ notification: Notification) { 
    if let textField = notification.object as? NSTextField { 
     filterTable(with: textField.stringValue) 
    } 
} 

@IBAction func pressedKeyButton(_ sender: NSButton) { 
    let character = sender.title 
    self.searchTextField.stringValue.append(character) 
    self.searchTextField.textDidChange(Notification(name: .NSControlTextDidChange,object: nil)) 
} 
+0

「self.searchTextField.textDidChange(Notification(name:.NSControlTextDidChange、object:nil))」とは何ですか?あなたのcontrolTextDidChangeは正しいとは思われません。 –

+0

pressedKeyButtonアクションがトリガされると、NSTexFieldの内容は更新されますが、controlTextDidChange関数はトリガされません。 –

答えて

1

これはMacアプリケーションなので、Cocoa Bindingsを使用してテキストフィールドにデータを入力すると、これをはるかに簡単にすることができます。単純にそうように、didSetブロックを使用してビューコントローラ上dynamicプロパティを宣言:

@objc dynamic var searchString: String = "" { 
    didSet { /* put notification code here */ } 
} 

次に、Interface Builderで、バインディングインスペクタで、テキストフィールドのValueは、ビューコントローラに結合する結合し、「モデルキーでパス "をsearchStringに設定します。また、 "継続的に更新値"チェックボックスをオンにします。独自のコードでは、テキストフィールドに直接アクセスするのではなく、searchStringプロパティを変更してテキストフィールドを更新します(テキストフィールドのコンセントを取り除くことも可能です)。テキストフィールドに表示される文字列の変更はすべてsearchStringプロパティを通過するため、ブロックdidSetが常に呼び出され、一貫して通知されます。

関連する問題