NSView获得焦点的方向(制表符或反制表符)?

时间:2018-11-20 18:09:37

标签: swift focus nsview appkit nsresponder

我有一个自定义视图,其中包含多个可以接收焦点的组件,类似于NSDatePicker风格的textFieldAndStepper。如果获得焦点,则第一个组件被聚焦。然后,您可以浏览各个组件。如果在最后一个组件具有焦点的情况下单击选项卡,则窗口中的下一个视图将获得焦点。使用backtab(Shift + Tab)时,它会朝另一个方向移动。我该怎么办?

我目前在keyDown事件中将焦点移到各个组件上,并且当用户切换到最后一个组件之外时,我将覆盖becomeFirstResponderresignFirstResponder以打开或关闭焦点或第一个组件之外的backtab。

但是在becomeFirstResponder中,我无法确定视图是如何获得焦点的。可能是标签页,背面标签或鼠标单击。

如何在becomeFirstResponder中获得此信息,或者有另一种方法来解决此问题。

请注意,出于各种原因,我不想介绍子视图。

这是我到目前为止的代码:

private var selectedComponent: Int?

override public var acceptsFirstResponder: Bool {
  get { return true }
}

override public func becomeFirstResponder() -> Bool {
  selectedComponent = 0
  needsDisplay = true
  return true
}

override public func resignFirstResponder() -> Bool {
  selectedComponent = nil
  needsDisplay = true
  return true
}

override public func keyDown(with event: NSEvent) {
  guard let selectedComponent = selectedComponent else {
    self.nextResponder?.keyDown(with: event)
    return
  }

  guard let specialKey = event.specialKey else {
    self.nextResponder?.keyDown(with: event)
    return
  }

  if specialKey == NSEvent.SpecialKey.tab && selectedComponent < componentFormats.count - 1 {
    self.selectedComponent = selectedComponent + 1
    needsDisplay = true
  } else if specialKey == NSEvent.SpecialKey.backTab && selectedComponent > 0 {
    self.selectedComponent = selectedComponent - 1
    needsDisplay = true
  } else {
    self.nextResponder?.keyDown(with: event)
  }
}

1 个答案:

答案 0 :(得分:0)

听起来您确实已经解决了问题。但是,我在想,是否可以通过覆盖NSView的nextKeyViewpreviousKeyView来获得相同的效果?这样不仅可以提供所需的方向性,而且还可以与整个系统(即辅助功能)进行交互,而不仅仅是通过按下按键进行交互。