目前我在视图中有多个文本字段。如果用户点击其中一个,则应该有响应该事件的功能。有没有办法如何做出反应(如果文本域得到焦点)?我用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]
这是我想要打电话的功能。
答案 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)")
}
希望这有助于其他人。