可能有不止一种方法可以做到这一点,但是继承 NSTextField 并使用 NSTextFieldDelegate 来获取文本更改是一种方法。可以通过将源代码复制/粘贴到名为“txtfld.swift”的文件中,然后使用下面给出的命令行代码在终端中运行。
/*
To run in Terminal: swiftc -framework Cocoa txtfld.swift -o txtfld && ./txtfld
*/
import Cocoa
var label: NSTextField!
class TextField: NSTextField, NSTextFieldDelegate {
func controlTextDidChange(_ obj: Notification){
label.stringValue = "Hello " + self.stringValue
}
}
var txtFld = TextField()
class ApplicationDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow!
func buildMenu() {
let mainMenu = NSMenu()
NSApp.mainMenu = mainMenu
// **** App menu **** //
let appMenuItem = NSMenuItem()
mainMenu.addItem(appMenuItem)
let appMenu = NSMenu()
appMenuItem.submenu = appMenu
appMenu.addItem(withTitle: "Quit", action:#selector(NSApplication.terminate), keyEquivalent: "q")
}
func buildWnd() {
let _wndW:CGFloat = 400
let _wndH:CGFloat = 150
window = NSWindow(contentRect: NSMakeRect( 0, 0, _wndW, _wndH ), styleMask: [.titled, .closable, .miniaturizable], backing: .buffered, defer: false)
window.center()
window.title = "Swift Test Window"
window.makeKeyAndOrderFront(nil)
// **** Text Field Subclass **** //
txtFld = TextField (frame:NSMakeRect( 30, _wndH - 40, 120, 24 ))
window.contentView!.addSubview(txtFld)
txtFld.delegate = txtFld
// ***** Text Field as Label **** //
label = NSTextField (frame:NSMakeRect( 160, _wndH - 40, 180, 24 ))
window.contentView!.addSubview (label)
label.backgroundColor = NSColor.clear
label.isSelectable = false
label.isBordered = false
label.font = NSFont( name:"Lucida Grande", size:14 )
// === Quit btn === //
let quitBtn = NSButton (frame:NSMakeRect( _wndW - 50, 5, 40, 40 ))
quitBtn.bezelStyle = NSButton.BezelStyle.circular
quitBtn.title = "Q"
quitBtn.action = #selector(NSApplication.terminate)
window.contentView!.addSubview(quitBtn)
}
func applicationDidFinishLaunching(_ notification: Notification) {
buildMenu()
buildWnd()
}
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
return true
}
}
let appDelegate = ApplicationDelegate()
let application = NSApplication.shared
application.setActivationPolicy(.regular)
application.delegate = appDelegate
application.activate(ignoringOtherApps:true)
application.run()