2014-12-05 44 views
10

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

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

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

+0

你有没有搞清楚?我正试图处理同样的事情。谢谢。 – pizzafilms 2015-03-30 21:24:54

+0

不,从来没有 - 我把它放在一边去处理别的事情,还没有回到它。 – starkos 2015-03-31 14:38:40

+0

你可以请出示一些代码吗? – rocky 2016-03-07 23:29:17

回答

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

} 
+0

关于NSControl子类化的现代引用,我的问题仍然存在;如果苹果发布了更新的文章,我还没有偶然发现它。就第一响应者而言:我离开了这个代码并采取了不同的方法,而且我记得太久了。 – starkos 2017-12-18 11:26:24

+0

如果排除NSCell,楼宇控制*更简单*。控件与处理用户输入事件的任何其他视图没有任何区别。过去,把它们分开的唯一的事情是他们使用NSCell作为事件和显示的主要机制,以便它们能够在表视图等中工作。现在NSCell已经死了,很简单 - 只需使用NSView/NSResponder中可用的内容即可/ NSControl API。我不确定新的指南真的会提供什么。 – seth 2017-12-19 01:19:48

相关问题