如何在Cocoa菜单栏应用程序中处理修饰键

时间:2019-05-02 12:41:45

标签: swift cocoa first-responder nsmenu nsmenuitem

因此,我有一个菜单栏应用程序,该菜单栏应用程序在自定义视图中具有一个滑块:我希望能够在拖动的同时按下选项键以使滑块捕捉到增量。

现在,一切正常... 除了我找不到找到通知菜单应用程序已按下选项键的单一方法。这是我尝试过的:

  1. NSEvent.addGlobalMonitorForEvents

    • “请注意,发送到您自己的应用程序的事件将不会调用您的处理程序。”
  2. NSEvent.addLocalMonitorForEvents

    • “对于嵌套事件跟踪循环所消耗的事件,例如控件跟踪,菜单跟踪或窗口拖动,将不会调用您的处理程序”
  3. NSApplication.shared.currentEvent

    • 此操作无效,因为应用未处理flagsChanged事件,因此该值设置为另一个值(按下鼠标按钮)。
  4. flagsChanged(with event: NSEvent)

    • 这不会被呼叫。我已将viewController设置为acceptFirstResponder,并辞去了视图的第一响应者。另外,我对视图进行了子类化,并覆盖了flagsChanged,但这没有用。
  5. 我尝试创建一个菜单项,该菜单项具有诸如“ s”或“ p”之类的键来触发动作。但是,当“操作”被触发时,菜单栏会隐藏...

因此,我试图找到如何在按下选项键时得到通知。这可能吗?我可以澄清您是否有任何疑问。

1 个答案:

答案 0 :(得分:1)

在自定义滑块视图的x = [1,2,3,19,19,24,1,1,2,2,3,3,2,3,1] df = pd.DataFrame({'ContextID': np.repeat([1,2], len(x)), 'StepID': x * 2}) df['StepID_new'] = df['StepID'] + df.groupby('ContextID')['StepID'].transform( lambda x: ((x==24).cumsum() > 0).shift(1, fill_value=0) * 25) print(df) 方法中,您只需检查NSEvent参数的 ContextID StepID StepID_new 0 1 1 1 1 1 2 2 2 1 3 3 3 1 19 19 4 1 19 19 5 1 24 24 6 1 1 26 7 1 1 26 8 1 2 27 9 1 2 27 10 1 3 28 11 1 3 28 12 1 2 27 13 1 3 28 14 1 1 26 15 2 1 1 16 2 2 2 17 2 3 3 18 2 19 19 19 2 19 19 20 2 24 24 21 2 1 26 22 2 1 26 23 2 2 27 24 2 2 27 25 2 3 28 26 2 3 28 27 2 2 27 28 2 3 28 29 2 1 26 来查看它是否包含选项键。

-

由于可以解释为滑块是一个实际的NSSlider,因此,实际上是使用NSSliderCell实现了滑块的控件,并且鼠标跟踪从视图传递到了mouseDown中的单元格,因此NSSlider的mouseDragged不会被调用,相反,您必须在单元格的mouseDragged方法中进行工作。但是,如果您使用的是NSSlider,则可能只想使用modifierFlags