鼠标按下行为NSControl和NSView的第一响应者

时间:2019-03-09 14:15:46

标签: swift nsview appkit first-responder nscontrol

我有一个自定义控件。如果它继承自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。

  1. 这种行为差异的原因是什么?
  2. 是否存在可以重写以影响它的方法或属性?
  3. 说我想要一种行为,即单击该视图时该视图成为第一响应者,并且该视图继承自refusesFirstResponder,在我的鼠标按下事件处理程序开始时调用NSControl是一个好的解决方案,或者还有更好的吗?

1 个答案:

答案 0 :(得分:2)

要覆盖的属性为needsPanelToBecomeKey

  

布尔值,指示视图在处理键盘输入和导航之前是否需要其面板成为键窗口。

     

此属性的默认值为false。子类可以重写此属性,并使用其实现来确定视图是否要求其面板成为键窗口,以便它可以处理键盘输入和导航。这样的子类还应该重写acceptsFirstResponder以返回true。

     

此属性还用于键盘导航。它确定鼠标单击是否应将焦点放在视图上(即使其成为第一响应者)。某些视图(例如,文本字段)在单击时希望获得键盘焦点。其他视图(例如,按钮)仅在您按Tab键时才获得焦点。您不希望仅因为单击了复选框就将焦点从正在进行编辑的文本字段转移到了

NSView返回trueNSControl返回false