Macos OS X 10.10中的自定义NSControl类
我需要开发一个新的自定义NSControl。我能找到的所有指南和示例(包括文章)都是围绕NSCell构建的。但从10.10开始,NSControl上所有与单元格相关的消息都已被弃用 我尝试创建一个子类并通过IB中的自定义视图添加到我的项目中,但我无法让控件接受first responder,尽管已启用,将refusesFirstResponder设置为NO,并从acceptsFirstResponder返回YES。我确信我错过了很多应该存在的功能(值更改通知等)Macos OS X 10.10中的自定义NSControl类,macos,cocoa,Macos,Cocoa,我需要开发一个新的自定义NSControl。我能找到的所有指南和示例(包括文章)都是围绕NSCell构建的。但从10.10开始,NSControl上所有与单元格相关的消息都已被弃用 我尝试创建一个子类并通过IB中的自定义视图添加到我的项目中,但我无法让控件接受first responder,尽管已启用,将refusesFirstResponder设置为NO,并从acceptsFirstResponder返回YES。我确信我错过了很多应该存在的功能(值更改通知等) 是否有新的参考资料显示了现在应该
是否有新的参考资料显示了现在应该如何开发控制?如果有,我的谷歌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()
}
}
你有没有想过?我正试图处理同样的事情。谢谢。不,我从来没有这样做过——我把它放在一边去做其他事情,还没有回来。你能给我看一些代码吗?我关于子类化NSControl的现代参考的问题仍然存在;如果苹果发布了一篇更新的文章,我还没有偶然发现它。至于第一响应者:我离开了那个代码,采取了一种不同的方法,那是很久以前的事了,我记不起来了。如果排除NSCell,构建控件要简单得多。控件实际上与处理用户输入事件的任何其他视图没有任何不同。过去将它们分开的唯一一件事是它们使用NSCell作为事件和显示的主要机制,这样它们就可以在表视图等中工作。现在NSCell已经死了,很简单——只需使用NSView/NSResponder/NSControl API中提供的功能即可。我不确定一个新的导游会提供什么。