OS X 10.10中的自定义NSControl类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OS X 10.10中的自定义NSControl类相关的知识,希望对你有一定的参考价值。

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

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

是否有更新的参考,显示如何开发控件?如果有的话,我的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()
    }

}

以上是关于OS X 10.10中的自定义NSControl类的主要内容,如果未能解决你的问题,请参考以下文章

NSControl isEnabled 仅在 OS X v10.0 到 OS X v10.9 中可用

mac os x10.10批量重命名教程:os x 10.10批量修改文件名步骤

sh 翻译:“OS X 10.10 Yosemite本地开发环境,Apache,PHP和MySQL与Homebrew”:3。停止如果已经安装了并且在运行中的Apache

安装 Mac OS X Yosemite (Mac OS 10.10) 后 Eclipse 无法启动

在 OS X 10.10 (Yosemite Beta) 中,如何使用 iOS 6.1 模拟器进行测试?

sh OS X 10.10 Yosemite升级检查