gpt4 book ai didi

swift - acceptsFirstMouse ... 不起作用(Swift 4.0,NSView)

转载 作者:行者123 更新时间:2023-11-28 13:53:24 24 4
gpt4 key购买 nike

当您执行返回 true 的“override func acceptsFirstMouse”时,View 应该作为第一响应者,即使它没有处于焦点,对吗?好吧,这是行不通的。写了一个小演示程序:当你在背景上按下 MouseDown 时,它会改变颜色。但是:当你打开一个新窗口而旧窗口失去焦点时,这种情况就不会再发生了。您首先必须再次聚焦旧窗口。

Does anybody know how to make this work?

顺便说一下,按钮总是接受第一个鼠标。

//  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(或其父类(super class))。 Swift 不要求您(也不会让您)在您的函数上使用 override 这一事实表明您实际上并没有覆盖一个方法。此外,如果您在尝试覆盖中放置了 print() 语句,您会发现它从未被调用。

您需要使用 NSView 的子类并重写那里的方法。

此外,关于:

When you do an 'override func acceptsFirstMouse' that returns true, the View should act as a first responder, even if it isn't in focus, right?

嗯,不完全是。这意味着即使窗口处于非事件状态,也会处理对 View 的点击。请注意,窗口的状态才是相关的,而不是 View 。事件窗口中的 View 接受点击,无论它是否是第一响应者(并且不一定因为被点击而成为第一响应者)。此外,第一响应者还有其他与点击无关且与 acceptsFirstMouse(for:) 无关的含义。

关于swift - acceptsFirstMouse ... 不起作用(Swift 4.0,NSView),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54249563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com