我目前正在用Swift编写一个OS X应用程序。我想做的是,当用户在NSTextField中输入文本时,我想运行一个函数来检查值并将其添加到标签中。我在Swift中如何做到这一点?
NSTextField
uajslkp61#
ViewController
NSTextDelegate
TextField
controlTextDidChange
import Cocoa @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate, NSTextFieldDelegate { @IBOutlet weak var window: NSWindow! @IBOutlet weak var textField: NSTextField! @IBOutlet weak var label: NSTextField! func applicationDidFinishLaunching(aNotification: NSNotification) { textField.delegate = self } override func controlTextDidChange(notification: NSNotification) { let object = notification.object as! NSTextField self.label.stringValue = object.stringValue } func applicationWillTerminate(aNotification: NSNotification) { // Insert code here to tear down your application } }
在视图控制器中:
import Cocoa class ViewController: NSViewController, NSTextDelegate { @IBOutlet weak var label: NSTextField! @IBOutlet weak var label2: NSTextField! @IBOutlet weak var textField: NSTextField! @IBOutlet weak var textField2: NSTextField! override func viewDidLoad() { super.viewDidLoad() } override func controlTextDidChange(notification: NSNotification) { if let txtFld = notification.object as? NSTextField { switch txtFld.tag { case 201: self.label.stringValue = txtFld.stringValue case 202: self.label2.stringValue = txtFld.stringValue default: break } } } }
wixjitnu2#
swift 5 xcode 10格式
//TODO: move oin a better place? extension NSTextField{ func controlTextDidChange(obj: NSNotification){} } class TracksController:NSViewController, NSTextFieldDelegate { ... } override func viewDidLoad() { super.viewDidLoad() //Search bar: self.searchBar.delegate = self NotificationCenter.default.addObserver(self, selector: #selector(controlTextDidChange(_:)), name: NSTextView.didChangeSelectionNotification, object: nil) }
//MARK:NSTextField委派
func controlTextDidChange(_ obj: Notification) { guard let object = obj.object as? NSTextView else{ return } let delegate = object.delegate guard let searchField = delegate as? NSSearchField else { return } let text = searchField.stringValue print(text) }
p8ekf7hl3#
我知道这个问题在一段时间前已经得到了解答,但我最终在Swift 3中为macOS找到了这个解决方案(不幸的是,它不适用于Swift 4),当文本字段被点击时,它会通知用户每一次击键。将此委托添加到您的类:-
NSTextFieldDelegate
在viewDidLoad()中
NotificationCenter.default.addObserver(self, selector: #selector(textDidChange(_:)), name: Notification.Name.NSTextViewDidChangeSelection, object: nil)
然后添加此函数:-
func textDidChange(_ notification: Notification) { print("Its come here textDidChange") guard (notification.object as? NSTextView) != nil else { return } let numberOfCharatersInTextfield: Int = textFieldCell.accessibilityNumberOfCharacters() print("numberOfCharatersInTextfield = \(numberOfCharatersInTextfield)") }
希望这对其他人有帮助。
t98cgbkg4#
上面的答案不适用于swift 4,
Swift 4解决方案
过程基本上是相同的,但是你只需要将一些功能扩展到NSTextfield类。我们必须这样做的原因是,像**controlTextDidChange:**这样的委托协议方法实际上根本不存在,因为旧的objective-c代码设计不能很好地Map到swift。objective-c中的NSTextFieldDelegate是一个非正式的协议,它和swift中的扩展是一样的。
示例
extension NSTextField{ func controlTextDidChange(obj: NSNotification){} } class SomeViewController:NSViewController,NSTextFieldDelegate { override func controlTextDidChange(_ obj: Notification) { let object = obj.object as! NSTextField let value = object.stringValue print(value) }
对于每一个你想使用的函数,从NSTextFieldDelegate中只需把该方法放在扩展子句中即可。
4条答案
按热度按时间uajslkp61#
ViewController
符合方案NSTextDelegate
。1.将
ViewController
指定为TextField
的受委托人。1.实作
controlTextDidChange
方法。在视图控制器中:
wixjitnu2#
swift 5 xcode 10格式
//MARK:NSTextField委派
p8ekf7hl3#
我知道这个问题在一段时间前已经得到了解答,但我最终在Swift 3中为macOS找到了这个解决方案(不幸的是,它不适用于Swift 4),当文本字段被点击时,它会通知用户每一次击键。
将此委托添加到您的类:-
在viewDidLoad()中
然后添加此函数:-
希望这对其他人有帮助。
t98cgbkg4#
上面的答案不适用于swift 4,
Swift 4解决方案
过程基本上是相同的,但是你只需要将一些功能扩展到NSTextfield类。我们必须这样做的原因是,像**controlTextDidChange:**这样的委托协议方法实际上根本不存在,因为旧的objective-c代码设计不能很好地Map到swift。objective-c中的NSTextFieldDelegate是一个非正式的协议,它和swift中的扩展是一样的。
示例
对于每一个你想使用的函数,从NSTextFieldDelegate中只需把该方法放在扩展子句中即可。