我的目标是,只要用户在topButton已经聚焦的情况下,只要在其Apple TV遥控器上按下“向上”键,就调用doSomething。目的是如果bottomButton处于焦点状态,则不应调用doSomething。但是,当用户按下时,焦点会在调用pressesBegan之前移至topButton。这将导致调用doSomething而不管焦点在哪个按钮上。
func doSomething() {
// goal is this function should only run when topButton is focused
}
override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
guard presses.first?.type == UIPress.PressType.upArrow else { return }
print(self.topButton.isFocused)
print(self.bottomButton.isFocused)
if self.topButton.isFocused {
doSomething()
}
}
请注意,此替代方法无效:
override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
guard let previouslyFocusedItem = context.previouslyFocusedItem as? UIButton else { return }
if previouslyFocusedItem == topButton {
self.doSomething()
}
}
因为如果用户在topButton上按下时焦点不会更新。
这将导致更复杂的代码(将不得不在两个函数之间添加属性和外观怪异的if语句,这会使其他开发人员感到困惑)。有没有更有效的解决方法?
能够改用UIFocusGuide解决它。我发现pressesBegan的另一个问题是它没有检测到用户是否向上滑动。 UIFocusGuide处理这两种情况。