![](/img/trans.png)
[英]Swift: how to apply "acceptsFirstMouse" for app build with SwiftUI?
[英]acceptsFirstMouse … doesn't work (Swift 4.0, NSView)
当您执行返回true的'override func acceptsFirstMouse'时,即使View不在焦点上,它也应该充当第一响应者,对吗? 好吧,它不起作用。 编写了一个演示程序:当您在背景上按下鼠标时,它会更改颜色。 但是:当您打开一个新窗口并且旧窗口失去焦点时,就不会再发生这种情况。 您首先必须再次使旧窗口成为焦点。
有人知道如何进行这项工作吗?
顺便说一句,按钮总是接受第一个鼠标。
// ViewController.swift
import Cocoa
let testWindow = TestWindow()
class ViewController: NSViewController {
func acceptsFirstMouse(for event: NSEvent?) -> Bool {
return true
}
@IBAction func PushMeButton(_ sender: NSButton) {
testWindow.show()
}
@IBAction func ChangeColorButton(_ sender: NSButton) {
self.view.layer?.backgroundColor = NSColor.random.cgColor
}
override func viewDidLoad() {
super.viewDidLoad()
self.view.wantsLayer = true;
}
override func mouseDown(with event: NSEvent) {
self.view.layer?.backgroundColor = NSColor.random.cgColor
}
}
extension NSColor {
static var random: NSColor {
let r:CGFloat = .random(in: 0 ... 1)
let g:CGFloat = .random(in: 0 ... 1)
let b:CGFloat = .random(in: 0 ... 1)
return NSColor(red: r, green: g, blue: b, alpha: 1)
}
}
acceptsFirstMouse(for:)
是NSView
上的方法,不是NSViewController
(或其超类)。 Swift并不要求您(也不允许您)对函数使用override
这一事实,这表明您实际上并未在重写方法。 另外,如果您在尝试覆盖的内容中放置了print()
语句,则将看到它永远不会被调用。
您需要使用NSView
的子NSView
并在那里重写方法。
另外,关于:
当您执行返回true的'override func acceptsFirstMouse'时,即使View不在焦点上,它也应该充当第一响应者,对吗?
好吧,不完全是。 这意味着即使窗口处于非活动状态,也会处理对视图的单击。 注意,窗口的状态是相关的,而不是视图。 活动窗口中的视图是否是第一个响应者都接受单击(不一定是因为被单击而成为第一个响应者)。 同样,第一响应者还有其他与点击无关的含义,与acceptsFirstMouse(for:)
没有任何关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.