[英]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.