我有一个自定义控件。如果它继承自if __name__ == '__main__':
app.run(port=1000)
,则当我单击它时它会自动成为第一响应者。如果它从NSView
继承,则不是。即使我重写NSControl
并且不调用super,行为上的差异仍然存在。
代码:
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
属性。设置为false。
refusesFirstResponder
,在我的鼠标按下事件处理程序开始时调用NSControl
是一个好的解决方案,或者还有更好的吗?答案 0 :(得分:2)
要覆盖的属性为needsPanelToBecomeKey
。
布尔值,指示视图在处理键盘输入和导航之前是否需要其面板成为键窗口。
此属性的默认值为false。子类可以重写此属性,并使用其实现来确定视图是否要求其面板成为键窗口,以便它可以处理键盘输入和导航。这样的子类还应该重写acceptsFirstResponder以返回true。
此属性还用于键盘导航。它确定鼠标单击是否应将焦点放在视图上(即使其成为第一响应者)。某些视图(例如,文本字段)在单击时希望获得键盘焦点。其他视图(例如,按钮)仅在您按Tab键时才获得焦点。您不希望仅因为单击了复选框就将焦点从正在进行编辑的文本字段转移到了
。
NSView
返回true
,NSControl
返回false
。