tvOS Presses开始调用为时已晚(在焦点已更改之后)

问题描述 投票:0回答:1

我的目标是,只要用户在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语句,这会使其他开发人员感到困惑)。有没有更有效的解决方法?

swift xcode tvos
1个回答
0
投票

能够改用UIFocusGuide解决它。我发现pressesBegan的另一个问题是它没有检测到用户是否向上滑动。 UIFocusGuide处理这两种情况。

© www.soinside.com 2019 - 2024. All rights reserved.