0

NSDatePicker我有一个自定义视图,它有多个可以接收焦点的组件,类似于textFieldAndStepper样式。如果它获得焦点,则第一个组件被聚焦。然后,您可以通过选项卡浏览组件。如果您在最后一个组件获得焦点时点击选项卡,则窗口中的下一个视图将获得焦点。当您使用 backtab(shift + tab)时,它会朝另一个方向发展。我该怎么做?

我目前在事件中沿着组件移动焦点keyDown,并且当用户选项卡超出最后一个组件或后退选项卡超出第一个组件时,我会覆盖becomeFirstResponderresignFirstResponder打开或关闭焦点。

但是,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)
  }
}
4

1 回答 1

0

听起来您现在确实解决了问题。但是,我在想,是否可以通过覆盖 NSViewnextKeyView和来获得相同的效果previousKeyView?这应该提供您需要的方向性,但也可能与整个系统(即可访问性)更好地交互,而不仅仅是通过按键。

于 2018-11-22T15:15:06.630 回答