OS X 10.10中的自定义NSControl类

问题描述 投票:10回答:1

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

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

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

macos cocoa
1个回答
1
投票

您的问题可能是您从未将控件实际设置为第一响应者。只需点击它就不会自动完成。下面是一个快速示例,它接受第一响应者状态(并且在点击时也是如此),并绘制一个焦点环。确保启用控件并设置其目标和操作。

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

}
© www.soinside.com 2019 - 2024. All rights reserved.