编辑文本字段时更改Label的Label.stringValue

问题描述

我试图创建一个实时文本字段,并在标签显示输入的字符串,但我不知道如何实现。

我现在所能做的只是通过单击按钮显示文本,但是我想跳过此按钮。该怎么做?

import Cocoa

class ViewController: NSViewController {

    @IBOutlet weak var namefiled: NSTextField!
    @IBOutlet weak var Mylabel: NSTextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    
    override var representedobject: Any? {
        didSet {
        // Update the view,if already loaded.
        }
    }

    @IBAction func SayHelloButtonClick(_ sender: Any) {
       
        let name:String = namefiled.stringValue
        
        let greeting:String = "Hello \(name)!"
    
        Mylabel.stringValue = greeting
    }
    
}

解决方法

执行此操作的方法可能不止一种,但是子类化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,_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,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()