簡體   English   中英

acceptsFirstMouse…不起作用(Swift 4.0,NSView)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM