【发布时间】:2019-08-10 18:36:40
【问题描述】:
我有两个NSTextField 对象,我想在用户点击它时突出显示它们。
NSWindow 加载时,初始文本字段已突出显示。我能够为文本字段单击获取鼠标按下事件,但无法区分用户点击了哪个文本字段。
我尝试使用从NSEvent 对象获得的NSPoint 在文本字段上使用hitTest,但返回的NSView 为零。它返回的视图是窗口的视图,而不是那个文本字段。
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!
// ...
}
我只向一个文本字段添加委托。
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)
}
}
【问题讨论】:
标签: swift macos cocoa nstextfield