【发布时间】:2019-03-09 14:15:45
【问题描述】:
我有一个自定义控件。如果它继承自NSView,当我点击它时它会自动成为第一响应者。如果它继承自 NSControl,则不会。这种行为差异仍然存在,即使我覆盖 mouseDown(with:) 并且不调用 super。
代码:
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)是一个很好的解决方案,或者有更好的解决方案?
【问题讨论】:
-
去
NSControl的文档,搜索“firstresponder”,你会找到refusesFirstResponder。也许这是覆盖的方法。 -
我知道那个属性。默认设置为
false。
标签: swift nsview appkit first-responder nscontrol