Swift 函数文本字段获得焦点 OSX

标签 swift macos delegates

目前我在 View 中有多个文本字段。如果用户点击其中一个,应该有一个函数响应该事件。有没有办法使用react(如果文本字段获得焦点)?我尝试使用 NSTextFieldDelegate 方法,但没有适合此事件的函数。

这是我的代码目前的样子:

class ViewController: NSViewController, NSTextFieldDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let textField = NSTextField(frame: CGRectMake(10, 10, 37, 17))
        textField.stringValue = "Label"
        textField.bordered = false
        textField.backgroundColor = NSColor.controlColor()
        view.addSubview(textField)

        textField.delegate = self

        let textField2 = NSTextField(frame: CGRectMake(30, 30, 37, 17))
        textField2.stringValue = "Label"
        textField2.bordered = false
        textField2.backgroundColor = NSColor.controlColor()
        view.addSubview(textField2)

        textField2.delegate = self

    }

    func control(control: NSControl, textShouldBeginEditing fieldEditor: NSText) -> Bool {
        print("working") // this only works if the user enters a charakter
        return true
    }

}

textShouldBeginEditing 函数仅在用户尝试输入字符时处理该事件,但这不是我想要的。如果他单击文本字段,它必须处理该事件。 有什么想法吗,非常感谢?

编辑

func myAction(sender: NSView)
{
    print("aktuell: \(sender)")
    currentObject = sender
}

这是我要调用的函数。

最佳答案

1) 创建 NSTextField 的子类。

import Cocoa

class MyTextField: NSTextField {

    override func mouseDown(theEvent:NSEvent) {
        let viewController:ViewController = ViewController()
        viewController.textFieldClicked()
    }
}

2) 通过界面构建​​,选择您想要关注的文本字段。导航到右侧 Pane 中的自定义类。然后将文本字段的类设置为您刚刚创建的类。

3) 以下是 ViewController 的示例。

import Cocoa

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }

    func textFieldClicked() -> Void {
        print("You've clicked on me!")
    }
}

4)以编程方式添加文本字段...

import Cocoa

class ViewController: NSViewController {

    let myField:MyTextField = MyTextField()

    override func viewDidLoad() {
        super.viewDidLoad()

        //let myField:MyTextField = MyTextField()
        myField.setFrameOrigin(NSMakePoint(20,70))
        myField.setFrameSize(NSMakeSize(120,22))
        let textField:NSTextField = NSTextField()
        textField.setFrameOrigin(NSMakePoint(20,40))
        textField.setFrameSize(NSMakeSize(120,22))
        self.view.addSubview(myField)
        self.view.addSubview(textField)
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }

    func textFieldClicked() -> Void {
        print("You've clicked on me!")
    }
}

关于Swift 函数文本字段获得焦点 OSX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37493657/

相关文章:

C# 我应该阻止一个事件被两次取消 Hook 吗?

objective-c - objective-c 中的未知类型名称

ios - NSLocalNotification 重复。开除。合适的方式

objective-c - Cocoa:如何像在 Mail.app 中一样绘制插入文本?

c - 递增变量直到溢出的循环结构?

database - 从 XCode 连接到 Microsoft Access 数据库

swift - 在 Swift 4 中获得时间

ios - Swift:XPC 连接中断并且应用程序卡住?

ios - 如何在 Swift 中访问不同 View Controller 中的数组中的值?

ios - Swift - 使用 selectedIndex 更改 var