【问题标题】:Custom NSControl classes in OS X 10.10OS X 10.10 中的自定义 NSControl 类
【发布时间】:2015-02-04 01:13:01
【问题描述】:

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

我尝试创建一个子类并通过 IB 中的自定义视图添加到我的项目中,但我无法让控件接受第一响应者,尽管已启用,将 rejectsFirstResponder 设置为 NO,并从 AcceptsFirstResponder 返回 YES。而且我确定我缺少很多本应存在的功能(值更改通知等)。

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

【问题讨论】:

  • 你搞清楚了吗?我正在尝试处理同样的事情。谢谢。
  • 不,从来没有——我把它放在一边做别的事情,还没有回来。
  • 你能显示一些代码吗?

标签: macos cocoa


【解决方案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()
    }

}

【讨论】:

  • 我关于继承 NSControl 的现代参考的问题仍然存在;如果 Apple 发布了更新的文章,我还没有偶然发现它。至于第一响应者:我留下了那段代码并采取了不同的方法,那是太久以前的事了。
  • 如果排除 NSCell,构建控件要简单得多。控件与处理用户输入事件的任何其他视图实际上并没有什么不同。过去唯一将它们分开的是它们使用 NSCell 作为事件和显示的主要机制,因此它们可以在表格视图等中工作。现在 NSCell 已经死了,这很简单——只需使用 NSView/NSResponder 中可用的东西/NSControl API。我不确定新指南会真正提供什么。
猜你喜欢
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
相关资源
最近更新 更多