我有一个自定义控件。如果它从NSView
继承,当我单击它时,它会自动成为第一响应者。如果它从NSControl
继承,则不会。行为上的这种差异仍然存在,即使我覆盖mouseDown(with:)
并且不要称呼超级。
代码:
class MyControl: NSView {
override var canBecomeKeyView: Bool { return true }
override var acceptsFirstResponder: Bool { return true }
override func drawFocusRingMask() { bounds.fill() }
override var focusRingMaskBounds: NSRect { return bounds }
override func draw(_ dirtyRect: NSRect) {
NSColor.white.set()
bounds.fill()
}
}
您可以看到,我覆盖acceptsFirstResponder
以及与关键视图和响应者相关的其他方法和属性。我还检查了refusesFirstResponder
属性。它设置为false。
- 这种行为差异的原因是什么?
- 我可以覆盖它影响它吗?
- 说我想要单击时视图成为第一响应者的行为,并且从
NSControl
继承的视图是在我的鼠标折扣事件处理程序开始时调用window!.makeFirstResponder(self)
是一个好的解决方案,还是有更好的解决方案?
覆盖的属性为 needsPanelToBecomeKey
。
一个布尔值指示该视图是否需要其面板才能成为键盘输入和导航之前成为键窗口。
此属性的默认值是错误的。子类可以覆盖此属性,并使用其实现来确定该视图是否要求其面板成为钥匙窗口,以便它可以处理键盘输入和导航。这样的子类也应覆盖接受firstresponder以返回true。
此属性也用于键盘导航。它确定鼠标点击是否应将焦点放在视图上,也就是说,使其成为第一响应者)。单击它们时,某些视图(例如,文本字段)希望接收键盘焦点。其他视图(例如,按钮)仅当您标记给它们时才会获得焦点。您不希望专注于仅仅因为您单击复选框而进行编辑的TextField。
。
NSView
返回true
,NSControl
返回false
。