繁体   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