gpt4 book ai didi

macos - OS X 10.10 中的自定义 NSControl 类

转载 作者:行者123 更新时间:2023-12-03 16:04:09 25 4
gpt4 key购买 nike

我需要开发一个新的自定义 NSControl。我能找到的所有指南和示例(包括 Apple's Subclassing NSControl 文章)都是围绕 NSCell 构建的。但自 10.10 起,NSControl 上所有与单元格相关的消息均已弃用。

我尝试创建一个子类并通过 IB 中的自定义 View 添加到我的项目中,但尽管已启用,但我无法获得接受第一响应者的控件,将拒绝第一响应者设置为“否”,并从acceptFirstResponder返回"is"。而且我确信我缺少了很多应该存在的功能(值更改通知等)。

是否有更新的引用资料可以显示现在应该如何开发控件?如果有的话,我的 Google-fu 让我失望了。谢谢!

最佳答案

您的问题可能是您从未真正将控件设置为第一响应者。仅单击它不会自动执行此操作。下面是一个简单的示例,它接受第一响应者状态(并且在单击时也变为如此),并绘制聚焦环。请务必启用该控件并设置其目标和操作。

class MyControl: NSControl {


override var acceptsFirstResponder: Bool {
return true
}


override func becomeFirstResponder() -> Bool {
return true
}


override func mouseDown(with event: NSEvent) {
window?.makeFirstResponder(self)
}

override func mouseUp(with event: NSEvent) {
if let action = action {
NSApp.sendAction(action, to: target, from: self)
}
}


override func draw(_ dirtyRect: NSRect) {
NSColor.white.set()
NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).fill()

if window?.firstResponder == self {
NSColor.keyboardFocusIndicatorColor.set()
} else {
NSColor.black.set()
}
NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).stroke()
}


override var focusRingMaskBounds: NSRect {
return bounds.insetBy(dx: 1, dy: 1)
}


override func drawFocusRingMask() {
NSBezierPath(roundedRect: bounds.insetBy(dx: 1, dy: 1), xRadius: 3, yRadius: 3).fill()
}

}

关于macos - OS X 10.10 中的自定义 NSControl 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27323132/

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