tvOS PressesBegan вызван слишком поздно (после того, как фокус уже меняется) - PullRequest
0 голосов
/ 29 октября 2019

Моя цель - вызывать doSomething всякий раз, когда пользователь нажимает «вверх» на пульте Apple TV, только когда верхняя кнопка уже настроена. Цель состоит в том, чтобы doSomething НЕ вызывался, если нижняя кнопка была сфокусирована. Однако, когда пользователь нажимает вверх, фокус перемещается вверх до topButton перед вызовом pressesBegan. Это приводит к тому, что 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 между двумя функциями, которые запутывают других разработчиков). Есть ли более эффективный обходной путь?

...