gpt4 book ai didi

swift - 如何检测Cocoa中哪个NSTextField被点击?

转载 作者:行者123 更新时间:2023-11-30 10:38:10 27 4
gpt4 key购买 nike

我有两个 NSTextField 对象,我想在用户单击它时突出显示它们。

初始文本字段已在 NSWindow 加载时突出显示。我能够获取文本字段单击的鼠标按下事件,但无法区分用户点击了哪个文本字段。

我尝试使用从 NSEvent 对象获取的 NSPoint 在文本字段上使用 hitTest,但返回的 NSView 为零。它返回的 View 是窗口 View ,而不是文本字段。

class SettingsViewController: NSViewController {
private var sview: SettingsView?

override func viewDidLoad() {
initEvents()
}

override func loadView() {
if let settingsView = SettingsView.createFromNib() {
self.view = settingsView
self.sview = settingsView as? SettingsView
}
}

func initEvents() {
self.sview!.emailTextField.delegate = self
}

}

extension SettingsViewController: NSTextFieldDelegate, NSTextDelegate {
override func mouseDown(with event: NSEvent) {
self.log.debug("mouse down: \(event.buttonNumber), \(event.eventNumber), \(event.locationInWindow)")
// How to know which text field triggered this?
}

func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
self.log.debug("control delegate")
return false
}

func textField(_ textField: NSTextField, textView: NSTextView, shouldSelectCandidateAt index: Int) -> Bool {
self.log.debug("text field should select")
return true
}

func textShouldBeginEditing(_ textObject: NSText) -> Bool {
self.log.debug("text field should being editing")
return true
}
}

class SettingsView: NSView {
private let log = Logger()
private static var topLevelObjects: NSArray?
@IBOutlet weak var emailTextField: ASTextField!
@IBOutlet weak var passwordTextField: NSSecureTextField!

// ...
}

我仅将委托(delegate)添加到一个文本字段。

self.sview!.emailTextField.delegate = self

但是当我单击 passwordTextField 时,我也会收到鼠标单击事件。为什么会发生这种情况?

如何区分NSTextField鼠标单击并突出显示文本字段?

<小时/>

我尝试子类化 NSTextField 并添加点击处理程序,但它不起作用。

class ASTextField: NSTextField {
private let log = Logger()

required init?(coder: NSCoder) {
super.init(coder: coder)
bootstrap()
}

override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
bootstrap()
}

override func awakeFromNib() {
super.awakeFromNib()
bootstrap()
}

func bootstrap() {
self.delegate = self
}
}

extension ASTextField: NSTextFieldDelegate {
override func mouseDown(with event: NSEvent) {
// This is not working
self.log.debug("mouse down")
super.mouseDown(with: event)
}
}

最佳答案

如果您想要的是在单击(聚焦)文本字段时能够选择文本,则可以重写该类以简化您的任务,并且不必担心找到单击的字段来自代表。

对于 NSView 对象,当它获得焦点(即单击或按 Tab 键)时,它将调用 becomeFirstResponder,以便我们可以挂接在那里。

当 NSTextField 变得可编辑(或可选择)时,它会获取可重用的“字段编辑器”,并在编辑期间将其覆盖在文本字段的顶部。如果您的 NSTextField 具有焦点,您可以使用 View 上的 currentEditor() 调用来获取此字段编辑器。

因此,一旦您拥有字段编辑器,您就可以在编辑器上执行 selectAll 来选择文本。

示例类:-

class AutoselectOnFocusTextField: NSTextField {
override func becomeFirstResponder() -> Bool {
guard super.becomeFirstResponder() else {
return false
}
if let editor = self.currentEditor() {
editor.perform(#selector(selectAll(_:)), with: self, afterDelay: 0)
}
return true
}
}

希望这有帮助!

关于swift - 如何检测Cocoa中哪个NSTextField被点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57444749/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com