Swift函数文本域得到了OSX的关注

时间:2016-05-27 23:27:19

标签: swift macos delegates

目前我在视图中有多个文本字段。如果用户点击其中一个,则应该有响应该事件的功能。有没有办法如何做出反应(如果文本域得到焦点)?我用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 } 函数仅在用户尝试输入字符时处理该事件,但这不是我想要的。如果他点击文本字段,它必须处理该事件。 任何想法,非常感谢?

修改

answer[i]

这是我想要打电话的功能。

2 个答案:

答案 0 :(得分:1)

1)创建NSTextField的子类。

import Cocoa

class MyTextField: NSTextField {

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

2)使用界面构建,选择您想要关注的文本字段。导航到右窗格中的“自定义类”。然后将文本字段的类设置为刚刚创建的类。

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!")
    }
}

答案 1 :(得分:0)

我知道它已经在一段时间之前得到了回答,但我最终在Swift 3中找到了这个macOS解决方案(不幸的是它不适用于Swift 4),它会在内部点击文本字段时(以及每个按键)。

将此委托添加到您的班级: -

NSTextFieldDelegate

在viewDidLoad()中添加以下内容: -

imputTextField.delegate = self

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)")
}

希望这有助于其他人。