OS X 10.10中的自定义NSControl类

sta*_*kos 10 macos cocoa

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

我尝试创建一个子类并通过IB中的自定义视图添加到我的项目中,但是我无法让控件接受第一响应者,尽管已启用,将refusesFirstResponder设置为NO,并从acceptsFirstResponder返回YES.而且我确信我错过了很多应该存在的功能(价值变化通知等).

是否有更新的参考,显示如何开发控件?如果有的话,我的Google-fu会让我失望.谢谢!

set*_*eth 4

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

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()
    }

}
Run Code Online (Sandbox Code Playgroud)